- В Windows 10 (MSVC 17.6) моя библиотека успешно собирает и связывает, а затем я я могу создать приложение и связать с ним свою библиотеку.
- В Ubuntu 20.04.6 (g++ 10.5.0, ld 2.34) мой библиотека успешно компонуется и связывается, но все приложения не могут с ней связаться, из-за множества ошибок, указывающих на неопределенную ссылку на некоторую библиотеку повышения.
Код: Выделить всё
/usr/bin/ld: ../../vcpkg_installed/x64-linux/debug/lib/libOpenImageIO_d.a(imageinput.cpp.o): in function `boost::thread_specific_ptr::~thread_specific_ptr()':
/mnt/c/Users/cgnam/source/repos/vira/out/ubuntu/vcpkg_installed/x64-linux/include/boost/thread/tss.hpp:61: undefined reference to `boost::detail::set_tss_data(void const*, void (*)(void (*)(void*), void*), void (*)(void*), void*, bool)'
Можно найти по адресу https://github.com/crgnam/oiio-linker-error(Требуется vcpkg на вашем компьютере):
Чтобы получить более подробную информацию без необходимости использования репозитория, структура файла выглядит следующим образом: это:
Код: Выделить всё
vcpkg.json
CMakeLists.txt
- include/
| - mylib/
| - mylib.hpp
- source/
| - myapp/
| | - CMakeLists.txt
| | - main.cpp
| - mylib/
| - CMakeLists.txt
| - mylib.cpp
- используется при запуске cmake -DCMAKE_TOOLCHAIN_FILE=
Код: Выделить всё
vcpkg
/scripts/buildsystems/vcpkg.cmake - Корневой файл CMakeLists.txt выглядит так:
Код: Выделить всё
cmake_minimum_required(VERSION 3.19)
option(BUILD_SHARED_LIBS "Build mylib as shared library" OFF)
project(example LANGUAGES CXX VERSION 0.8.0)
set(CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
if (BUILD_SHARED_LIBS)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
# Add the included directories:
include_directories(include)
# Add source directories:
add_subdirectory(source/mylib)
add_subdirectory(source/myapp)
# Copy example data so that example program can run:
file(COPY data DESTINATION ${CMAKE_BINARY_DIR})
- Источник/mylib/CMakeLists.txt выглядит следующим образом:
Код: Выделить всё
find_package(OpenImageIO CONFIG REQUIRED)
if (BUILD_SHARED_LIBS)
add_library(mylib SHARED mylib.cpp)
else()
add_library(mylib STATIC mylib.cpp)
endif()
target_link_libraries(mylib PRIVATE OpenImageIO::OpenImageIO)
- Источник/myapp/CMakeLists.txt выглядит следующим образом:
Код: Выделить всё
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE mylib)
- Различные версии OpenImageIO доступны на vcpkg (Я пробовал как самую последнюю версию 2.5.12, так и 2.5.8)
- Создание библиотеки как СТАТИЧЕСКОЙ, так и ОБЩЕЙ
Установка ссылки интерфейс OpenImageIO с моей библиотекой с использованием PUBLIC вместо PRIVATE (изменение source/mylib/CMakeLists.txt на использование: target_link_libraries(mylib PUBLIC OpenImageIO::OpenImageIO))< /li>
Связывание OpenImageIO напрямую с моим приложением (изменение source/myapp/CMakeLists.txt для использования: target_link_libraries(myapp PRIVATE OpenImageIO::OpenImageIO mylib))
Подробнее здесь: https://stackoverflow.com/questions/787 ... penimageio