es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  , ,

Answer

  1. Avatar for 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.

Comments are closed.