我对 cmake 很陌生,但我仍然坚持一种我想要理解和克服的奇怪行为。
我创建了一个使用Paho MQTT C library的可执行文件。这个可执行文件的内容是无关紧要的,让我们说它现在只是连接到代理,没什么特别的。
要编译我的程序,我使用cmake
和CMakeLists.txt
文件,它可以做一些事情:
这是:
project(myproject)
include(ExternalProject)
########## CMAKE VERSION AND FLAGS ##########
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
########## MQTT EXTERNAL LIB ##########
set(MQTT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mqtt)
ExternalProject_Add(
project_mqtt
GIT_REPOSITORY https://github.com/eclipse/paho.mqtt.c
GIT_TAG v1.2.0
PREFIX ${MQTT_BUILD_DIR}
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)
add_library(mqtt STATIC IMPORTED)
set(MQTT_LIB ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib/libpaho-mqtt3a.1.2.0.dylib)
set_property(TARGET mqtt PROPERTY IMPORTED_LOCATION ${MQTT_LIB})
add_dependencies(mqtt project_mqtt)
include_directories(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include)
link_directories(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib)
########## EXECUTABLE ##########
add_executable(myproject ../src/main.cpp)
target_link_libraries(myproject mqtt)
请注意,在我特别为Mac编译的文件中,我对
.dylib
后缀进行了硬编码,但这不是问题
我的文件夹结构如下:
myproject/
-- CMakeLists.txt
-- bin/
-- build/
-- src/
- main.cpp
我的编译工作流程非常标准:cd build && cmake ../ && make
。
我的来源位于/src
,我在/build
中构建了所有内容,而我的可执行文件则在/bin
中编写。由于我不想在系统中安装{{1>我希望我的项目自包含一种方式)。
效果很好(我的意思是,它会编译)。
但是当我运行该程序时,我收到*.dylib
错误。
..这很正常"正常",因为我的lib已安装在bin/lib
中,我的可执行文件在其自己的文件夹(dyld: Library not loaded: libpaho-mqtt3a.1.dylib
)中搜索它们。因此,例如,如果我运行:bin/lib
,它的效果非常好。
所以,现在我的问题是:
[哲学上]这是一个好方法吗?我想使用这个外部库,但我不想在我的代码中包含Paho lib源代码,所以我觉得ExternalProject是一个很好的方法。它在编译我的项目之前在编译时编译lib,我发现这个过程非常方便。我找了一个"包经理"对于C ++,似乎没有一个强烈的共识(我正在寻找类似* composer *或* npm * for web apps 的东西),所以我没有走这条路。 / p>
为什么,为什么,我的可执行文件在其自己的目录bin/
中查找库文件?我可以改变吗?我错过了一些 cmake 配置吗?我想我可以使用 cmake 自定义命令将库文件复制到cd bin/lib && ../myproject
文件夹中,但这看起来像是对我的黑客攻击。不是吗?
老实说,我希望没有"路径依赖"在我的可执行文件中,可以说在特定系统上编译时,可执行文件可以放在这个系统的任何地方,然后可以完美地工作。我理解这意味着编译的Paho MQTT lib应该静态 in 我的可执行文件,但我想知道如何做到这一点(甚至真正实际上意味着什么)。有可能吗?
我可能会错过C / C ++编译和外部lib工作流如何工作的一部分,但我认为我接近于非常强大的东西,它只是运行时的这个lib路径,我会喜欢正确理解和修复。
我对这方面的建议非常开放 非常感谢!