2014-05-04 35 views
5

我似乎无法获得我正在构建的库来正确链接我的GoogleTest单元测试二进制文件。使用GoogleTest和CMake测试C库的单元

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 

我有以下结构的项目:

|-- 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 /库中的库的可执行文件。

如何让我的单元测试正确链接到我正在构建的库?

更多参考:

的的CMakeLists.txt在SRC/

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() 
+1

'make VERBOSE = 1'将帮助您确定哪些符号完全未定义 – user3159253

+0

以上输出来自make VERBOSE = 1。未定义的符号在我试图链接的库中定义。这适用于CLI,但不适用于我的单元测试。 – Erik

+0

'VERBOSE = 1'回应实际的链接命令。如果链接正确并且顺序正确,那么检查unit_test.cc.o中的符号是否与libmylib.so中定义的符号相匹配(如果您不熟悉,相关命令为'nm')。 – Anycorn

回答

0

你似乎编译32位二进制(“-arch x86_64”选项无处可见),但试图使用6 Google测试的4位版本。

+0

向CFLAGS和CXX_FLAGS添加显式-m64和-arch x86_64不起作用。 (CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -m64 -std = C++ 0x -stdlib = libC++ -g3 -Wall -O0 -arch x86_64”) SET(CMAKE_C_FLAGS“$ {CMAKE_C_FLAGS} -m64 -arch x86_64” ) ''' – Erik

+0

以下是所有有问题的代码:https://github.com/ebenoist/libblinkstick – Erik