【发布时间】:2023-01-24 04:08:18
【问题描述】:
有一个名为 revolta 的静态库正在构建,然后安装到 sysroot 中:
set( CMAKE_INSTALL_PREFIX <path to sysroot> )
# ReVolta c++ library name
set( TARGET_LIBREVOLTA "revolta" )
add_library( ${TARGET_LIBREVOLTA} STATIC )
target_include_directories( ${TARGET_LIBREVOLTA}
PUBLIC
# Once the librevolta targets are being exported, this include directory in which the lib is installed is used
$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>
PRIVATE
# Include directory used privately just to build the library itself
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
)
target_sources( ${TARGET_LIBREVOLTA}
PUBLIC
...
)
之后,一旦构建了 librevolta,就会使用以下命令将其安装到系统根目录中:
# Install all the revolta headers into include directory and copy the built library
install( TARGETS ${TARGET_LIBREVOLTA} EXPORT ${TARGET_LIBREVOLTA}
FILE_SET HEADERS DESTINATION "${CMAKE_INSTALL_PREFIX}/include"
ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib"
)
和连接的自定义命令:
# Once the librevolta is built, install it to the sysroot as specified by 'install()' commands
add_custom_command( TARGET ${TARGET_LIBREVOLTA} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS --install . )
到目前为止,一切都很好。这按预期工作,一旦 CMake 构建了“revolta”目标,它就会构建并安装到使用 ${CMAKE_INSTALL_PREFIX} 安装的 sysroot 中。
我的问题是,一旦我尝试将目标添加为其他 lib/可执行文件中的链接目标,它就会以某种方式自动将 librevolta 源路径包含到 include 中,并使用构建目录中的相对路径而不是安装到 sysroot 中的路径链接库在 librevolta 构建之后的步骤中执行。
其他一些库/可执行文件:
target_link_libraries( ${APP_EXECUTABLE}
PRIVATE
revolta
)
构建完成后,包含路径 -I/home/martin/git/revolta/source/librevolta 被添加(源位置),即使它在上面的片段中被声明为 PRIVATE:
PRIVATE
# Include directory used privately just to build the library itself
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
并且只有${CMAKE_INSTALL_PREFIX}/include 是公开的...
此外,该库是从构建树中获取的,而不是从它的安装位置获取的:
../../librevolta/librevolta.a
代替
/home/martin/git/revolta/sysroot/lib/librevolta.a
您能否建议我如何正确设置 revolta 目标,使其正确使用其源代码来构建自身,但一旦在其他地方使用,它会从同一位置(尊重标准位置)提供 sysroot 安装的标头和构建的库?
暗示:我还尝试从应用程序中完全删除 revolta 目标,指定仅使用 sys root(gcc 选项 --sysroot=/home/martin/git/revolta/sysroot),它工作正常,正确的标头和 lib 被使用但是一旦 librevolta 未构建和安装,目标不会在应用程序构建之前运行,因为那时没有定义依赖关系......
【问题讨论】:
标签: cmake static-linking