我正在尝试使用cmake(在Linux上使用GNU make和g ++)来构建一个包含两个子目录的项目:MyLib和MyApp。 MyLib包含静态库的源代码; MyApp需要链接到该库。我正在尝试使用生成的makefile在Linux上构建,使用以下CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (MyProj)
include_directories (MyLib)
file(GLOB MyLibSrc MyLib/*.cpp)
add_library(MyLibrary STATIC ${MyLibSrc})
file(GLOB MyAppSrc MyApp/*.cpp)
add_executable(MyApplication ${MyAppSrc})
target_link_libraries(MyApplication MyLibrary)
这“几乎”有效。它在链接时失败,因为它生成libMyLibrary.a - 它在根目录中。当我添加:
link_directories(${MyProj_BINARY_DIR})
没有区别。
我有一些(相互关联的)问题:
我是cmake的新手。我已经阅读了我在网上可以找到的内容,但发现自己很难让我的库与我的可执行文件链接。在我看来,这种配置应该很常见。一个小便的例子会很有帮助,但我找不到一个。
答案 0 :(得分:21)
嗯,最好先阅读example并做一些确切的建议。
cmake_minimum_required (VERSION 2.6)
project (MyProj CXX)
add_subdirectory(MyLib)
add_subdirectory(MyApp)
然后,对于指定的每个子目录,都会创建CMakeLists.txt文件
MyLib中\的CMakeLists.txt
file(GLOB SRC_FILES *.cpp)
add_library(MyLib ${SRC_FILES})
MyApp的\的CMakeLists.txt
file(GLOB SRC_FILES *.cpp)
add_executable(MyApp ${SRC_FILES})
target_link_libraries(MyApp MyLib)
答案 1 :(得分:4)
使用“源代码构建”。创建一个仅用于构建的目录,并在其中调用
cmake <path to the sources, it may be relative>
使用
link_directories(${MyProj_BINARY_DIR}/MyLib)
或在每个子目录中创建CMakeLists.txt - 这对于大于非常小的项目会更好。
这有点棘手,请查看文档中的CMAKE_BUILD_TYPE(您可以设置它和/或“if”)。您也可以从命令行设置它:
cmake -DCMAKE_BUILD_TYPE=Debug
答案 2 :(得分:4)
我发现了(1)的'最佳'解决方案......所以,我想我应该在这里发布:
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage)
之前让我困惑的是静态库不被Cmake视为LIBRARY - 它们被认为是ARCHIVE。
答案 3 :(得分:0)
不要在根Cmakelists.txt中添加库和可执行文件。在子目录的Cmakelists.txt中添加这些库和可执行文件。