在 CMake 中使用 /usr/lib/i386-linux-gnu 而不是 /usr/lib/x86_64-linux-gnu 到 find_library
Using /usr/lib/i386-linux-gnu instead of /usr/lib/x86_64-linux-gnu to find_library in CMake
如何让 CMake 查找 i386 库而不是 x86_64 个库?
我正在尝试在机器上构建 i386 linux 可执行文件以供以后部署。我已经确定我已经安装了我的依赖项的 i386 版本,并且它们在 /usr/lib/i386-linux-gnu
下,而 64 位库在 /usr/lib/x86_64-linux-gnu
下,正如预期的那样。
但是,在构建 32 位时,我似乎找不到让 CMake 在 /usr/lib/i386-linux-gnu
下查找我的库的方法。将 make CMAKE_CXX_FLAGS
设置为包含 -m32
只会导致 linking 失败,因为编译器正在构建 32 位可执行文件并尝试向其 link 64 位库,这显然做不到。它这样做是因为它以某种方式更喜欢 /usr/lib/x86_64-linux-gnu/libsfml-system.so
而不是 /usr/lib/i386-linux-gnu/libsfml-system.so
例如。
到目前为止我已经尝试过:
- 将
-m32
添加到我的编译标志,导致可执行文件不 link
- 将我的
CMAKE_FIND_ROOT_PATH
设置为 /usr/lib/i386-linux-gnu
,希望它能先在该目录下查找,尽管它仍然找到了 64 位版本的库。
我真的没有更多的想法,虽然我在论坛上积极研究,但我似乎找不到太多有用的东西。也许这里有人知道我接下来可以做什么。
我的 CMakeLists.txt 目前为止:
cmake_minimum_required(VERSION 3.5)
project(Synapse)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread -O3 -m32")
set(CMAKE_SYSTEM_PROCESSOR i386)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION gnu)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake_modules)
find_package(SFML 2.4 COMPONENTS system window graphics network audio REQUIRED)
include_directories(${SFML_INCLUDE_DIR})
message(STATUS ${SFML_LIBRARIES})
set(CLIENT_SOURCE_FILES Client/main.cpp types.h Client/Mouse.cpp Client/Mouse.h Client/Game.cpp Client/Game.h Client/Camera.cpp Client/Camera.h Client/Renderer.cpp Client/Renderer.h Networking.h)
add_executable(SynapseClient ${CLIENT_SOURCE_FILES})
set(SERVER_SOURCE_FILES Server/main.cpp types.h Server/Game.cpp Server/Game.h Server/Commander.cpp Server/Commander.h Server/Unit.cpp Server/Unit.h Server/Client.cpp Server/Client.h Networking.h Server/Log.cpp Server/Log.h Server/User.cpp Server/User.h)
add_executable(SynapseServer ${SERVER_SOURCE_FILES})
target_link_libraries(SynapseClient ${SFML_LIBRARIES})
target_link_libraries(SynapseServer ${SFML_LIBRARIES})
让CMake知道你不想在调用之前搜索64位路径
find_package()
:
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF)
文档:
如何让 CMake 查找 i386 库而不是 x86_64 个库?
我正在尝试在机器上构建 i386 linux 可执行文件以供以后部署。我已经确定我已经安装了我的依赖项的 i386 版本,并且它们在 /usr/lib/i386-linux-gnu
下,而 64 位库在 /usr/lib/x86_64-linux-gnu
下,正如预期的那样。
但是,在构建 32 位时,我似乎找不到让 CMake 在 /usr/lib/i386-linux-gnu
下查找我的库的方法。将 make CMAKE_CXX_FLAGS
设置为包含 -m32
只会导致 linking 失败,因为编译器正在构建 32 位可执行文件并尝试向其 link 64 位库,这显然做不到。它这样做是因为它以某种方式更喜欢 /usr/lib/x86_64-linux-gnu/libsfml-system.so
而不是 /usr/lib/i386-linux-gnu/libsfml-system.so
例如。
到目前为止我已经尝试过:
- 将
-m32
添加到我的编译标志,导致可执行文件不 link - 将我的
CMAKE_FIND_ROOT_PATH
设置为/usr/lib/i386-linux-gnu
,希望它能先在该目录下查找,尽管它仍然找到了 64 位版本的库。
我真的没有更多的想法,虽然我在论坛上积极研究,但我似乎找不到太多有用的东西。也许这里有人知道我接下来可以做什么。
我的 CMakeLists.txt 目前为止:
cmake_minimum_required(VERSION 3.5)
project(Synapse)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread -O3 -m32")
set(CMAKE_SYSTEM_PROCESSOR i386)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION gnu)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake_modules)
find_package(SFML 2.4 COMPONENTS system window graphics network audio REQUIRED)
include_directories(${SFML_INCLUDE_DIR})
message(STATUS ${SFML_LIBRARIES})
set(CLIENT_SOURCE_FILES Client/main.cpp types.h Client/Mouse.cpp Client/Mouse.h Client/Game.cpp Client/Game.h Client/Camera.cpp Client/Camera.h Client/Renderer.cpp Client/Renderer.h Networking.h)
add_executable(SynapseClient ${CLIENT_SOURCE_FILES})
set(SERVER_SOURCE_FILES Server/main.cpp types.h Server/Game.cpp Server/Game.h Server/Commander.cpp Server/Commander.h Server/Unit.cpp Server/Unit.h Server/Client.cpp Server/Client.h Networking.h Server/Log.cpp Server/Log.h Server/User.cpp Server/User.h)
add_executable(SynapseServer ${SERVER_SOURCE_FILES})
target_link_libraries(SynapseClient ${SFML_LIBRARIES})
target_link_libraries(SynapseServer ${SFML_LIBRARIES})
让CMake知道你不想在调用之前搜索64位路径
find_package()
:
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF)
文档: