英文:
how to choose specific lib while cross-compiling (using vcpkg and cmake)
问题
我使用vcpkg和cmake进行跨平台开发。在WSL上完成一个示例代码后,我尝试将工具链更改为arm-linux-gnueabihf,然后出现以下错误信息:
[cmake] Could not find a configuration file for package "plog" that is compatible
[cmake] with requested version "".
[cmake]
[cmake] The following configuration files were considered but not accepted:
[cmake]
[cmake] /home/fuxiaoer/vcpkg/installed/x64-linux/share/plog/plogConfig.cmake, version: 1.1.9 (64bit)
[cmake]
[cmake] Call Stack (most recent call first):
[cmake] CMakeLists.txt:11 (find_package)
[cmake]
其中plog
是我尝试在这个项目中使用的库。
然后我移除了plog:x64-linux并重新构建项目,结果显示:
Could not find a package configuration file provided by "plog" with any of
[cmake] the following names:
[cmake]
[cmake] plogConfig.cmake
[cmake] plog-config.cmake
我尝试在[vcpkgroot]/triplets/arm-linux-gnueabihf.cmake中编写一个arm-linux-gnueabihf.cmake文件,内容如下:
set(VCPKG_TARGET_ARCHITECTURE arm)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)
set(VCPKG_CMAKE_SYSTEM_PROCESSOR arm)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)
然后使用vcpkg install plog:arm-linux-gnueabihf
安装一个使用arm-linux-gnueabihf构建的新库,它成功工作了。其中/vcpkg/installed
显示了3个文件夹:
arm-linux-gnueabihf vcpkg x64-linux
当我回到我的cmake项目时,它显示了和之前提到的相同的错误信息。似乎cmake没有更改其搜索路径,仍然使用默认路径x64-linux来查找。
我在我的CMakeLists.txt中添加了一行来告诉cmake plog的位置:
set(plog_DIR "/home/fuxiaoer/vcpkg/installed/arm-linux-gnueabihf/share/plog")
然后这个项目终于可以成功构建了,这意味着我使用的方法有效。
我的CMakeLists.txt如下所示:
cmake_minimum_required(VERSION 3.0.0)
project(cmake_with_ninja_and_vcpkg VERSION 0.1.0 LANGUAGES C CXX)
include(CTest)
enable_testing()
# set(plog_DIR "/home/fuxiaoer/vcpkg/installed/arm-linux-gnueabihf/share/plog")
find_package(Eigen3 CONFIG REQUIRED)
find_package(plog CONFIG REQUIRED)
add_executable(cmake_with_ninja_and_vcpkg main.cpp)
target_link_libraries(cmake_with_ninja_and_vcpkg PRIVATE Eigen3::Eigen)
target_link_libraries(cmake_with_ninja_and_vcpkg PRIVATE plog::plog)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
英文:
I use vcpkg and cmake to do some cross-platform devlpment.
After finishing an sample code at WSL,I tried to change my toolchain to arm-linux-gnueabihf,then it shows below.
[cmake] Could not find a configuration file for package "plog" that is compatible
[cmake] with requested version "".
[cmake]
[cmake] The following configuration files were considered but not accepted:
[cmake]
[cmake] /home/fuxiaoer/vcpkg/installed/x64-linux/share/plog/plogConfig.cmake, version: 1.1.9 (64bit)
[cmake]
[cmake] Call Stack (most recent call first):
[cmake] CMakeLists.txt:11 (find_package)
[cmake]
where plog
is a lib I try to use in this project.
then I remove plog:x64-linux.rebuild my project.it shows:
Could not find a package configuration file provided by "plog" with any of
[cmake] the following names:
[cmake]
[cmake] plogConfig.cmake
[cmake] plog-config.cmake
I tred to wriet an arm-linux-gnueabihf.cmake file for vcpkg at [vcpkgroot]/triplets/arm-linux-gnueabihf.cmake.
set(VCPKG_TARGET_ARCHITECTURE arm)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)
set(VCPKG_CMAKE_SYSTEM_PROCESSOR arm)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)
then use vcpkg install plog:arm-linux-gnueabihf
to install a new lib which use arm-linux-gnueabihf to build and it worked.
where /vcpkg/installed
shows 3 folders
arm-linux-gnueabihf vcpkg x64-linux
When turn around to my cmake project,it shows same message like I mentioned before.it seems like cmake do not change its search path,and still use default path x64-linux to find
I added a new line at my cmakelists.txt to tell cmake where plog is.
set(plog_DIR "/home/fuxiaoer/vcpkg/installed/arm-linux-gnueabihf/share/plog")
then this project finally can build successfuly.that means the method I use worked.
my CMakeLists.txt is shown below.
cmake_minimum_required(VERSION 3.0.0)
project(cmake_with_ninja_and_vcpkg VERSION 0.1.0 LANGUAGES C CXX)
include(CTest)
enable_testing()
# set(plog_DIR "/home/fuxiaoer/vcpkg/installed/arm-linux-gnueabihf/share/plog")
find_package(Eigen3 CONFIG REQUIRED)
find_package(plog CONFIG REQUIRED)
add_executable(cmake_with_ninja_and_vcpkg main.cpp)
target_link_libraries(cmake_with_ninja_and_vcpkg PRIVATE Eigen3::Eigen)
target_link_libraries(cmake_with_ninja_and_vcpkg PRIVATE plog::plog)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
答案1
得分: 0
更改工具链只需要进行干净的重新配置(即使用一个新的文件夹或删除CMakeCache.txt)。如果没有这样做,你无法更改vcpkg的三元组。
如果你尝试在已经配置好的项目中切换,或者忘记将VCPKG_TARGET_TRIPLET
设置为你实际想要使用的三元组,那么就会出现你描述的情况。你可能还想设置VCPKG_HOST_TRIPLET
。不要忘记在project()
之前定义这些变量。
英文:
> I tried to change my toolchain to arm-linux-gnueabihf
changing toolchains simply requires a clean reconfigure (meaning using a fresh folder or deleting the CMakeCache.txt). You cannot change vcpkg triplets without that.
> it seems like cmake do not change its search path,and still use default path x64-linux to find
that is exactly what happens if you try to switch in an already configured project or forget to set VCPKG_TARGET_TRIPLET
to the triplet you actually want to use. You might want to also set VCPKG_HOST_TRIPLET
. Don't forget this needs to be defined before project()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论