简体   繁体   中英

Static linking agains boost.test with cmake for mingw on windows

I would like to compile my project on windows 7, using mingw-4.9, cmake 3.8, and with Boost 1.63.0. It's a standalone unittest project. It takes files from production source directory and test files from test folder mockups(substitution) are places also in separete folder.

I'm not sure what I'm doing wrong.

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} )

Files structure in my project:

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

I'm using CMake GUI (v3.8.0 rc4) to generate the Makefile, then I run

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

from the directory where CMake prepared the files and the output is following:

...
[ 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

Same code works for me in CodeBlocks 16.01 project. (Boost, MinGW, same paths, settings, versions etc.)

I can provide more info if is needed.

I will also welcome some hints regarding the CMakeLists.txt.

I found the solution by myself after a while.

Everything is all right except the file(..) commands. For different location should be used different variables for example:

# 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)

And then:

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

If variable SOURCE is used as it is in the question every assigment overwrites the data and at the end it contains only the last path.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM