我似乎无法让我正在构建的库正确地链接到我的GoogleTest单元测试二进制文件。在构建的链接阶段失败:
Linking CXX executable ../../target/unit_tests
cd /Users/ebenoist/development/mylib/build/test && /usr/local/Cellar/cmake/2.8.12.2/bin/cmake -E cmake_link_script CMakeFiles/unit_tests.dir/link.txt --verbose=0
Undefined symbols for architecture x86_64:
"a_function_in_my_lib(int, int, int)", referenced from:
test_my_lib_AssertionTrue_Test::TestBody() in unit_tests.cc.o
I have a project with the following structure:
|-- src
| | -- mylib.c
| | -- mylib.h
| | -- mylibcli.c
|-- build
| | ... CMakeStuff
|-- target
| | -- mylib.a
|-- test
| | -- unit_tests.cc
我测试目录下的CMakeList.txt看起来像这样:
include_directories(${gtest_SOURCE_DIR}/include ${COMMON_INCLUDES})
set(test_sources unit_tests.cc)
add_executable(unit_tests ${test_sources})
target_link_libraries(unit_tests gtest gtest_main mylib)
add_test(unit-tests unit_tests)
我知道这个函数存在,而且库已经编译成功了,因为在我的 src/ 目录下有一个可执行文件是针对该库构建的。
我该如何让我的单元测试正确链接到我正在构建的库?
更多参考:
src/ 中的 CMakeLists.txt 文件
include_directories(${COMMON_INCLUDES})
# LIBRARY
add_library(mylib STATIC mylib.c)
# CLI TOOL
add_executable(mylibcli mylibcli.c)
target_link_libraries (mylibcli mylib)
在/目录下的CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (mylib)
enable_testing()
option(test "Build all tests." OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../target)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../target)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../target)
set(COMMON_INCLUDES ${PROJECT_SOURCE_DIR}/src)
add_subdirectory(src)
if (test)
add_subdirectory(vendor/gtest-1.7.0)
add_subdirectory(test)
endif()
make VERBOSE=1
可以帮助您确定哪些符号未定义。 - user3159253VERBOSE=1
会打印出实际的链接命令。如果正确链接并且顺序正确,则检查unit_test.cc.o
文件中定义的符号是否与libmylib.so
中定义的符号相匹配(使用nm
命令进行检查,如果你还不熟悉)。 - Anycorncd /Users/ebenoist/development/mylib/build/test && /usr/local/Cellar/cmake/2.8.12.2/bin/cmake -E cmake_link_script CMakeFiles/unit_tests.dir/link.txt --verbose=1 /usr/bin/c++ -std=c++11 -stdlib=libc++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/unit_tests.dir/unit_tests.cc.o -o ../../target/unit_tests ../../target/libgtest.a ../../target/libgtest_main.a ../../target/mylib.a ../../target/libgtest.a -lusb-1.0 Undefined symbols for architecture x86_64:
- Erik