2017-10-12 216 views
1

我正在使用fast-cpp-csv-parserdate库的项目,并且想要添加zmq(0mq)但无法使CMakeList正常工作。使用多个库时,在CMakeList中配置target_link_libraries的正确方法是什么?获取无法指定链接库错误

下面是一个工作CMakeList.txt

cmake_minimum_required(VERSION 3.7) 
project(sample_project) 

set(CMAKE_CXX_STANDARD 14) 
set(SOURCE_FILES source/main.cpp include/csv.h include/date.h) 


find_package (Threads) 
add_executable(sample_project ${SOURCE_FILES}) 
target_link_libraries (sample_project ${CMAKE_THREAD_LIBS_INIT}) 

作为每zmq instructions以下已经被添加到CMakeLists.txt(已安装ZMQ和CPPZMQ)。

find_package(cppzmq) 
if(cppzmq_FOUND) 
    include_directories(${cppzmq_INCLUDE_DIR}) 
    target_link_libraries(sample_project ${cppzmq_LIBRARY}) 
endif() 

当我上面的代码添加到CMakeLists.txt,它看起来像这样:

cmake_minimum_required(VERSION 3.7) 
project(sample_project) 

set(CMAKE_CXX_STANDARD 14) 
set(SOURCE_FILES source/main.cpp include/csv.h include/date.h) 

find_package(cppzmq) 
if(cppzmq_FOUND) 
    include_directories(${cppzmq_INCLUDE_DIR}) 
    target_link_libraries(sample_project ${cppzmq_LIBRARY}) 
endif() 

find_package (Threads) 
add_executable(sample_project ${SOURCE_FILES}) 
target_link_libraries (sample_project ${CMAKE_THREAD_LIBS_INIT}) 

而在下面的错误结果:

CMake Warning at /usr/local/share/cmake/cppzmq/cppzmqConfig.cmake:44 (find_package): 
    By not providing "FindZeroMQ.cmake" in CMAKE_MODULE_PATH this project has 
    asked CMake to find a package configuration file provided by "ZeroMQ", but 
    CMake did not find one. 

    Could not find a package configuration file provided by "ZeroMQ" with any 
    of the following names: 

    ZeroMQConfig.cmake 
    zeromq-config.cmake 

    Add the installation prefix of "ZeroMQ" to CMAKE_PREFIX_PATH or set 
    "ZeroMQ_DIR" to a directory containing one of the above files. If "ZeroMQ" 
    provides a separate development package or SDK, be sure it has been 
    installed. 
Call Stack (most recent call first): 
    CMakeLists.txt:7 (find_package) 


CMake Error at CMakeLists.txt:10 (target_link_libraries): 
    Cannot specify link libraries for target "sample_project" which is not 
    built by this project. 


-- Configuring incomplete, errors occurred! 
See also "/home/greg/CLionProjects/sample_project/cmake-build-debug/CMakeFiles/CMakeOutput.log". 
See also "/home/greg/CLionProjects/sample_project/cmake-build-debug/CMakeFiles/CMakeError.log". 

[Finished] 

如何正确添加使用CMakeLists.txt附加库?

+0

问题是cppzmq无法找到libzmq。也许一些建议[这里](https://github.com/zeromq/cppzmq/issues/127)可能会有所帮助。 – Mark

回答

2

您必须重新订购您的CMakeLists.txt以便target_link_libraries位于add_executable之后。

例如:

cmake_minimum_required(VERSION 3.7) 
project(sample_project) 

set(CMAKE_CXX_STANDARD 14) 
set(SOURCE_FILES source/main.cpp include/csv.h include/date.h) 

find_package(cppzmq) 
if(cppzmq_FOUND) 
    include_directories(${cppzmq_INCLUDE_DIR}) 
endif() 

find_package (Threads) 
add_executable(sample_project ${SOURCE_FILES}) 
target_link_libraries (sample_project ${CMAKE_THREAD_LIBS_INIT}) 

if(cppzmq_FOUND) 
    target_link_libraries(sample_project ${cppzmq_LIBRARY}) 
endif() 

作为一个方面的话,我会建议使用的target_include_directories代替include_directories。这也可以将所有cppzmq相关的东西打包在一起。

+0

非常感谢!我正在用这个拉我的头发。如何使用'target_include_directories'而不是'include_directories'?当我替换它们时,我得到'target_include_directories调用的参数个数不正确。我尝试在参数中添加'sample_project',但是导致'不能指定包含目标的sample目录'sample_project',它不是由这个项目构建的。' – Greg

+1

@Greg它会f.i.是'target_include_directories(sample_project PUBLIC $ {cppzmq_INCLUDE_DIR})'。我喜欢这个命令,因为它告诉你只需要'sample_project'这些包含目录,它不会污染可能在后面定义的其他目标。 – oLen

相关问题