CMake Boost Linking не соблюдая порядок - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь скомпилировать проект, который использует OpenVDB. Сам OpenVDB зависит от Boost.

Проект состоит из нескольких библиотек и нескольких исполняемых файлов. Одна из библиотек нуждается в OpenVDB (и, следовательно, Boost), а исполняемый файл нуждается в этой библиотеке.

Мои списки CMakeList можно упростить до

Root CMakeLists

set(BOOST_LIBRARYDIR ${EXTERNAL_DIR}/boost/stage/lib)
set(BOOST_INCLUDEDIR ${EXTERNAL_DIR}/boost)
set(Boost_NO_SYSTEM_PATHS ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
if (UNIX AND NOT APPLE)
set(Boost_USE_STATIC_RUNTIME ON)
endif()
if (WIN32)
find_package(Boost REQUIRED COMPONENTS filesystem system)
else()
find_package(Boost REQUIRED COMPONENTS system filesystem iostreams)
endif()

Библиотека CMakeLists

find_package(OpenVDB REQUIRED)
find_package(IlmBase REQUIRED)
find_package(TBB REQUIRED)
find_package(zlib REQUIRED)
find_package(CUDA REQUIRED)


add_library(lib STATIC ${SOURCES})

target_link_libraries(lib PUBLIC deCore)
target_link_libraries(lib PUBLIC deGeom)

target_include_directories(lib PUBLIC ${CUDA_TOOLKIT_INCLUDE})
target_include_directories(lib PUBLIC ${CUDA_INCLUDE_DIRS})
target_link_libraries(lib PUBLIC ${CUDA_LIBRARIES})
target_link_libraries(lib PUBLIC ${CUDA_CUBLAS_LIBRARIES})

target_link_libraries(lib
    PUBLIC
    ${OPENVDB_LIBRARIES}
    ${ZLIB_LIBRARIES}
    ${TBB_LIBRARIES}
    ${ILMBASE_LIBRARIES}
    Boost::boost
    )

target_include_directories(lib PUBLIC ${OPENVDB_INCLUDE_DIRS})
target_include_directories(lib PUBLIC ${ILMBASE_INCLUDE_DIRS})
target_include_directories(lib PUBLIC ${TBB_INCLUDE_DIRS})
target_include_directories(lib PUBLIC ${ZLIB_INCLUDE_DIRS})

И, наконец, исполняемый файл

find_package(GLEW REQUIRED)
find_package(RapidJSON)

add_executable(exe ${SOURCES})

target_include_directories(exe PUBLIC ${RAPIDJSON_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS})

target_include_directories(exe INTERFACE ../../External ../../External/include)
target_link_libraries(exe PUBLIC Boost::system lib ${RAPIDJSON_LIBRARIES} ${GLEW_LIBRARIES} Boost::system)

Я знаю, что Boost :: system повторяется, я делаю это специально, чтобы попытаться сделать это ссылкой, но безуспешно.

Вызвана следующая строка компоновщика

/usr/bin/c++   -fopenmp -g -DDEBUG   CMakeFiles/exe.dir/main.cpp.o  -o ../../bin/deStart  -L/opt/cuda/lib64/stubs  -L/opt/cuda/lib64  -L/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.1 -Wl,-rpath,/opt/cuda/lib64:/home/jjcasmar/Doctorado/Desilico/External/usr/local/lib: ../../../../External/boost/stage/lib/libboost_system-mt-sd.a ../../lib/liblib.a ../../../../External/lib/Debug/libglew_debug.a ../../../../External/boost/stage/lib/libboost_system-mt-sd.a ../../../../External/lib/Debug/libglfw3_debug.a /usr/lib/libXrandr.so /usr/lib/libXxf86vm.so /usr/lib/libXcursor.so /usr/lib/libXinerama.so /usr/lib/libXi.so /usr/lib/libSM.so /usr/lib/libICE.so /usr/lib/libX11.so /usr/lib/libXext.so -lpthread /usr/lib/librt.so /usr/lib/libdl.so /opt/cuda/lib64/libcublas.so /opt/cuda/lib64/libcublas_device.a ../../../../External/lib/Debug/libzlib_debug.a ../../../../External/lib/Debug/libIlmBase_debug.a -ldl -lgomp ../../../../External/usr/local/library/librestbed.a ../../lib/libdeGL.a ../../lib/libdeCore.a ../../lib/libdeGeom.a ../../lib/libdeCore.a ../../lib/libdeGeom.a ../../../../External/lib/Debug/libmongocxx-static_debug.a ../../../../External/lib/Debug/libbsoncxx-static_debug.a ../../../../External/lib/Release/libmongoc-static-1.0.a ../../../../External/lib/Debug/libbson-static-1.0_debug.a -lstdc++fs -lssl -lcrypto -lcrypt -lresolv -lz -lrt ../../../../External/usr/local/lib/libOpenMeshTools.so ../../../../External/usr/local/lib/libOpenMeshCored.so ../../../../External/usr/local/lib/libOpenMeshToolsd.so ../../../../External/lib/Debug/libglew_debug.a /usr/lib/libGLX.so /usr/lib/libOpenGL.so /opt/cuda/lib64/libcudart.so ../../../../External/lib/Debug/libOpenVDB_debug.a ../../../../External/lib/Debug/libtbb_debug.a ../../../../External/lib/Debug/libtbbmalloc_proxy_debug.a ../../../../External/lib/Debug/libtbbmalloc_debug.a ../../lib/libdeCuda.a -lcudadevrt -lcudart_static -lrt -lpthread -ldl 

Как вы можете видеть, OpenVDB подключается почти до конца, в то время как boost связывается раньше, поэтому у меня возникает ошибка сцепления boost как эта

/usr/bin/ld: ../../../../External/lib/Debug/libOpenVDB_debug.a(Archive.o): in function `openvdb::v4_0_1::io::getErrorString[abi:cxx11](int)':
/home/jjcasmar/Doctorado/Desilico/External/prj/gmake/../../OpenVDB/OpenVDB/openvdb/io/Archive.cc:520: undefined reference to `boost::system::generic_category()'

Я не уверен, почему Boost связывается до OpenVDB, так как я четко указал, чтобы связывать Boost после OpenVDB и пытался принудительно связать его с первым и последним из исполняемого файла.

Эта ошибка возникает только в Linux.

Есть идеи о том, что происходит?

...