2017-04-25 78 views
0

我想在Windows 7上使用mingw-4.9,cmake 3.8和Boost 1.63.0来编译我的项目。 这是一个独立的单元测试项目。它将生产源目录中的文件和测试文件夹中的测试文件模型(替换)都放在分隔文件夹中。静态链接boost.test与cmake窗口上的mingw

我不知道我在做什么错。

的CMakeLists.txt

cmake_minimum_required(VERSION 3.8) 

project(myProject) 

# C, C++ are enabled by default 
#enable_language(C CXX) 

#definitions 
add_definitions(-DWIN32) 
add_definitions(-DBOOST_UNITTEST) 
add_definitions(-DG_NEWIOSTREAM) 

# Configure outputs 
set(ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/../../output/lib") 
set(LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/../../output/lib") 
set(RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/../../output/bin") 

# Detect operating system 
message(STATUS "Operating system is ${CMAKE_SYSTEM_NAME}") 
if($(CMAKE_SYSTEM_NAME) STREQUAL "Linux") 
    add_definitions(-DSYSTEM_LINUX) 
endif() 
if($(CMAKE_SYSTEM_NAME) STREQUAL "Windows") 
    add_definitions(-DSYSTEM_WINDOWS) 
endif() 

# Detect host processor 
message (STATUS "The host processor is ${CMAKE_HOST_SYSTEM_PROCESSOR}") 

# Settings the Boost Library 
set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 

# Debuging for cmake 
#set(Boost_DEBUG ON) 

# Set path to the Boost Library 
set(Boost_NO_SYSTEM_PATHS ON) 
set(BOOST_ROOT "c:\\dev\\external") 
set(BOOST_INCLUDEDIR "C:\\dev\\external\\include") 
set(BOOST_LIBRARYDIR "C:\\dev\\external\\lib\\boost") 
# At the end find the package, include and link 
find_package(Boost 1.63.0 REQUIRED COMPONENTS unit_test_framework regex) 
include_directories(${Boost_INCLUDE_DIRS})  

# Configure source files for production code 
file(GLOB SOURCES ../../sources/*.cpp) 

# Configure source files for unit-test code 
file(GLOB SOURCES source/*.cpp) 
file(GLOB SOURCES source/subs/*.cpp) 

# Tell the cmake what needs to be builded 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}) 
add_executable(myProject ${SOURCES}) 

# Tell CMake to link it 
target_link_libraries(myProject ${Boost_LIBRARIES}) 

文件结构在我的项目:

project 
|--sources <-(production code) 
|--test 
| |--source  <-(test code) 
| | |--subs <-(substitutions, mockups) 
| |--CMakeLists.txt 
|--output 
    |--test <-(cmake generates here) 

我使用的CMake GUI(v3.8.0 RC4)来生成Makefile文件,然后我跑

... output\test>C:\MinGW\bin\mingw32-make.exe 

从CMake准备的文件的目录和输出如下:

... 
[ 87%] Building CXX object CMakeFiles/myProject.dir/source/subs/subs_trace_publ.cpp.obj 
[100%] Linking CXX executable myProject.exe 
C:/dev/external/lib/boost/libboost_unit_test_framework-mgw49-mt-1_63.a(unit_test_main.o):unit_test_main.cpp:(.text.startup+0x14): 
undefined reference to `init_unit_test_suite(int, char**)' 
collect2.exe: error: ld returned 1 exit status 
CMakeFiles\myProject.dir\build.make:260: recipe for target 'myProject.exe' failed 
mingw32-make[2]: *** [myProject.exe] Error 1 
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/myProject.dir/all' failed 
mingw32-make[1]: *** [CMakeFiles/myProject.dir/all] Error 2 
Makefile:82: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

相同的代码工程 CodeBlocks 16.01项目中的我。 (Boost,MinGW,相同路径,设置,版本等)

如果需要,我可以提供更多信息。

我也欢迎关于CMakeLists.txt的一些提示。

回答

0

我在一段时间后自己找到了解决方案。

除文件(..)命令外,一切都正常。 对于不同的位置,应使用不同的变量,例如:

# Configure source files for production code 
file(GLOB SOURCES_PRODUCTION ../../sources/*.cpp) 

# Configure source files for unit-test code 
file(GLOB SOURCES_TEST source/*.cpp) 
file(GLOB SOURCES_SUBS source/subs/*.cpp) 

然后:

add_executable(myProject ${SOURCES_PRODUCTION} ${SOURCES_TEST} ${SOURCES_SUBS}) 

如果使用可变SOURCE,因为它是在每一个分配新建分配FY覆盖数据的问题,并在结束它只包含最后一个路径。