¿Cómo configurar CMakeList para enlazar de manera adecuada?
Estoy teniendo problemas para entender la documentación de CMake. La mayor parte de mi vida como programador ha sido en C#. Así que esto es nuevo para mí.
Lo que tengo es una estructura de directorios así:
- bin/
— <vacío> - include/
— cmocka.h
— cmocka_pbc.h
— cmocka_private.h - lib/
— libcmocka.dll.a - src/
— jargon/
| — <*.c *.h> - testing/
— jargon_test/
| — main.c (ejecutable de consola)
| — <*.c *.h>
He estado trabajando en CMakeLists.txt de la siguiente manera:
cmake_minimum_required(VERSION 3.20)
project(jargon_test C)
set(CMAKE_C_STANDARD 11)
add_executable(jargon_test main.c tokentests.h tokentests.c)
include_directories(
"../../src/jargon/"
"../../include"
)
add_library(cmocka SHARED IMPORTED)
set_target_properties(cmocka
PROPERTIES
IMPORTED_LOCATION "../../lib/libcmocka.dll.a"
INTERFACE_INCLUDE_DIRECTORIES "../../include/cmocka"
)
Estoy usando CLion 2021.2.3.
Al intentar compilar, obtengo los siguientes errores:
CMakeFiles\jargontest.dir/objects.a(tokentests.c.obj): En la función test_hello’:
directorio:29: referencia indefinida aassert_true`CMakeFiles\jargontest.dir/objects.a(tokentests.c.obj): En la función run_token_tests’:
directorio:47: referencia indefinida acmocka_run_group_tests`
El código fuente en sí no tiene problemas. Pero, para completitud, aquí están los archivos de origen:
“` c
// token_tests.h
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdint.h>
#include <cmocka.h>
#include "jargon.h"
#ifndef JARGON_TOKEN_TESTS_H
#define JARGON_TOKEN_TESTS_H
void test_hello(void ** state);
int setup(void * state);
int teardown(void * state);
int run_token_tests(void);
#endif //JARGON_TOKEN_TESTS_H
// token_tests.c
#include "token_tests.h"
void test_hello(void ** state) {
int ret = 0;
assert_true(ret == 0);
}
int setup(void ** state) {
printf("ejecutando prueba\n");
<pre><code>return 0;
</code></pre>
}
int teardown(void ** state) {
return 0;
}
int run_token_tests(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_hello)
};
<pre><code>int count_fail_tests = cmocka_run_group_tests(tests, setup, teardown);
return count_fail_tests;
</code></pre>
}
“`</cmocka.h></stdint.h></setjmp.h></stddef.h></stdarg.h></stdio.h>
davy.ai
Parece que me falta algo en el archivo CMakeLists.txt. ¿Podría alguien ayudarme?
Parece que te falta un comando linker en tu archivo CMakeLists.txt. Necesitas agregar la siguiente línea a tu archivo CMakeLists.txt:
target_link_libraries(jargon_test cmocka)
Esto enlazará la biblioteca cmocka con tu ejecutable, permitiéndole acceder a las funciones definidas en la biblioteca.