2013-03-22 68 views
16

我想使用CMake将我的项目链接到我的共享库。图书馆只在少数几个项目之间共享,而且很小,所以我真的很想在链接之前构建它。每次构建它似乎都比维护最新的预编译版本更好,因为我会将其与项目一起更改。它是分开的,因为它包含了我在下一个项目中几乎可以肯定需要的东西。使用CMake静态链接到项目外的库

如何配置CMake来完成它?

我为相关项目当前的CMakeLists.txt看起来是这样的:

find_package(Boost REQUIRED COMPONENTS unit_test_framework) 

include_directories(${BaumWelch_SOURCE_DIR}/../../grzesLib/src 
        ${BaumWelch_SOURCE_DIR}/src 
        ${Boost_INCLUDE_DIRS}) 

if(CMAKE_COMPILER_IS_GNUCXX) 
    add_definitions(-g -std=c++11 -Wall -Werror -Wextra -pedantic -Wuninitialized) 
endif() 


# Create the unit tests executable 
add_executable(
baumwelchtests stateindextest.cpp baumiterationtest.cpp baumwelchtest.cpp sampleparameters.cpp sdetest.cpp 
# Key includes for setting up Boost.Test 
testrunner.cpp 
# Just for handy reference 
exampletests.cpp 
) 

# Link the libraries 
target_link_libraries(baumwelchtests ${Boost_LIBRARIES} baumwelchlib grzeslib) 

但显然编译失败:

/usr/bin/ld: cannot find -lgrzeslib 
+0

如果您将.a添加到libname,它会工作吗? – drescherjm 2013-03-22 12:01:24

+0

@drescherjm,这个库在那个时候甚至没有被编译过,而且我也没有指定二进制文件的位置,所以我确定将.a添加到libname中将无济于事。 – Grzenio 2013-03-22 15:07:04

回答

26

你提到你想构建库,而不是使用预编译版本。如果库有一个CMakeList,你应该使用add_subdirectory(path/to/the/library/source/directory)来添加它。它将成为你的项目的一个子项目,你可以在你的CMakeList中正常使用它的目标名称。

请注意,虽然该命令被称为add_ 子目录,它可以是磁盘上的任意目录;它不一定是主项目的源目录的子目录。如果它不是一个子目录,你也必须为它明确指定一个二进制目录。示例:

add_subdirectory(/path/to/the/library/source/directory subproject/grzeslib) 

第二个参数如果作为相对路径给出,则相对于CMAKE_CURRENT_BINARY_DIR进行解释。

+2

我试过,但我得到以下错误:'add_subdirectory没有给出二进制目录,但给定源 目录“/ home/ga1009/PhD/cpp/grzesLib/src”不是 的子目录“/ home/ga1009 /博士/ CPP/PMI/CPP”。当指定一个树外源代码时,必须明确指定二进制目录。我应该怎样处理这个问题? – Grzenio 2013-03-22 15:03:26

+0

@Grzenio我已将信息添加到答案。 – Angew 2013-03-22 17:28:43

+0

我得到@Grzenio的相同错误...它不允许我放置任何任意目录。 – 2016-09-26 18:27:33