Cmake:设置 rpath
Cmake: setting rpath
我正在尝试在 C++ 项目上从 GNU Make 切换到 CMake。
我的计划是与我的库的源代码一起分发,还有需要的两个外部库的代码。
项目结构如下
├── CMakeLists.txt
├── lib
│ ├── lib1
│ └── lib2
├── main.cpp
└── src
├── CMakeLists.txt
├── subdir1
├── subdir2
现在,在 lib1 下,有另一个名为 'lib' 的文件夹,其中包含 lib1 需要的库:
Boost、Eigen、TBB 和日晷。
主要问题是我需要设置 rpath 标志以指向 tbb 库。
在我的 Makefile 中,事情是这样的
LIB1 := lib/lib1
LIB2 := lib/lib2
CXX = g++
CFLAGS = \
-std=c++1y \
-MMD \
-I$(LIB1) \
-I$(LIB1)/lib/eigen_3.3.3/ \
-I$(LIB1)/lib/boost_1.69.0/ \
-I$(LIB1)/lib/sundials_4.1.0/include \
-I$(LIB1)/lib/tbb_2019_U8/include \
-I$(LIB2) \
-D_REENTRANT
LDLIBS = \
$(shell pkg-config --libs protobuf) -lpthread -L$(LIB1)/lib/tbb \
-ltbb -Wl,-rpath,"$(LIB1)/lib/tbb"
事情进展顺利
现在,迁移到 CMake,我很难指定正确的 rpath 标志。
我的尝试如下
cmake_minimum_required(VERSION 3.13.0)
project(myproj)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PROTO REQUIRED protobuf)
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath,${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb")
add_executable(bayesmix main.cpp)
add_subdirectory(src)
target_include_directories(bayesmix PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/boost_1.69.0
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/eigen_3.3.3
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb_2019_U8/include)
target_link_libraries(bayesmix
-L${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb
-ltbb
-lpthread
${PROTO_LIBRARIES})
target_compile_options(myproj PUBLIC -D_REENTRANT -fPIC)
当我 运行 全部完成时,我得到以下类似错误
/usr/bin/ld: cannot find -ltbb
我试着查看文档 (https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling),但我没有find/understand如何解决我的问题!
尝试使用 target_link_options
而不是 target_link_libraries
。
cmake 中的命令比较直白。尝试:
target_link_directories(bayesmix PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb
)
target_link_libraries(bayesmix PRIVATE
tbb
pthread
${PROTO_LIBRARIES}
)
我正在尝试在 C++ 项目上从 GNU Make 切换到 CMake。 我的计划是与我的库的源代码一起分发,还有需要的两个外部库的代码。
项目结构如下
├── CMakeLists.txt
├── lib
│ ├── lib1
│ └── lib2
├── main.cpp
└── src
├── CMakeLists.txt
├── subdir1
├── subdir2
现在,在 lib1 下,有另一个名为 'lib' 的文件夹,其中包含 lib1 需要的库: Boost、Eigen、TBB 和日晷。 主要问题是我需要设置 rpath 标志以指向 tbb 库。
在我的 Makefile 中,事情是这样的
LIB1 := lib/lib1
LIB2 := lib/lib2
CXX = g++
CFLAGS = \
-std=c++1y \
-MMD \
-I$(LIB1) \
-I$(LIB1)/lib/eigen_3.3.3/ \
-I$(LIB1)/lib/boost_1.69.0/ \
-I$(LIB1)/lib/sundials_4.1.0/include \
-I$(LIB1)/lib/tbb_2019_U8/include \
-I$(LIB2) \
-D_REENTRANT
LDLIBS = \
$(shell pkg-config --libs protobuf) -lpthread -L$(LIB1)/lib/tbb \
-ltbb -Wl,-rpath,"$(LIB1)/lib/tbb"
事情进展顺利
现在,迁移到 CMake,我很难指定正确的 rpath 标志。 我的尝试如下
cmake_minimum_required(VERSION 3.13.0)
project(myproj)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PROTO REQUIRED protobuf)
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath,${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb")
add_executable(bayesmix main.cpp)
add_subdirectory(src)
target_include_directories(bayesmix PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/boost_1.69.0
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/eigen_3.3.3
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb_2019_U8/include)
target_link_libraries(bayesmix
-L${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb
-ltbb
-lpthread
${PROTO_LIBRARIES})
target_compile_options(myproj PUBLIC -D_REENTRANT -fPIC)
当我 运行 全部完成时,我得到以下类似错误
/usr/bin/ld: cannot find -ltbb
我试着查看文档 (https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling),但我没有find/understand如何解决我的问题!
尝试使用 target_link_options
而不是 target_link_libraries
。
cmake 中的命令比较直白。尝试:
target_link_directories(bayesmix PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/lib/tbb
)
target_link_libraries(bayesmix PRIVATE
tbb
pthread
${PROTO_LIBRARIES}
)