Неразрешенные символы: ссылки на библиотеки stati c, включенные в другие пакеты cmake - PullRequest
0 голосов
/ 16 апреля 2020

Я борюсь с созданием пакета CMake, который использует одну внешнюю stati c библиотеку, включенную из других пакетов CMake. Я подготовил грубую диаграмму для вас, чтобы визуализировать мои настройки. Пурпурным помечены пакеты CMake.

enter image description here

Я могу скомпилировать пакет lib и framework индивидуально без проблем, что так всегда. Однако когда я пытаюсь собрать exe , используя lib и framework , компоновщик говорит мне, что он не может разрешить символы, поступающие из внешней библиотеки (python37).

РЕДАКТИРОВАТЬ # 3:

framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyType_Type
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyType_Type
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyType_Type
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyBaseObject_Type
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyBaseObject_Type
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyBaseObject_Type
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol _Py_NoneStruct
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol _Py_NoneStruct
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol _Py_NoneStruct
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol _Py_NotImplementedStruct
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol _Py_NotImplementedStruct
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol _Py_NotImplementedStruct
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol _Py_FalseStruct
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol _Py_FalseStruct
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol _Py_FalseStruct
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol _Py_TrueStruct
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol _Py_TrueStruct
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol _Py_TrueStruct
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyCFunction_Type
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyCFunction_Type
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyCFunction_Type
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyInstanceMethod_Type
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyInstanceMethod_Type
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyInstanceMethod_Type
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyCapsule_Type
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyCapsule_Type
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyCapsule_Type
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyProperty_Type
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyProperty_Type
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyProperty_Type
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_ImportError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_IndexError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_IndexError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_IndexError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_MemoryError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_MemoryError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_MemoryError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_OverflowError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_OverflowError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_OverflowError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_RuntimeError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_RuntimeError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_RuntimeError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_SystemError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_SystemError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_SystemError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_TypeError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_TypeError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_TypeError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_ValueError
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_ValueError
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_ValueError
4>framework.lib(DebugCommunicationLink.obj) : error LNK2001: unresolved external symbol PyExc_FutureWarning
4>lib.lib(PythonModuleLoader.obj) : error LNK2001: unresolved external symbol PyExc_FutureWarning
4>lib.lib(PythonScriptingSystem.obj) : error LNK2001: unresolved external symbol PyExc_FutureWarning
4>D:\Code\Cplusplus\SupraHotSandbox\vsstudio\Debug\suprahotsandbox.exe : fatal error LNK1120: 19 unresolved externals

Я также попытался сгенерировать проект exe для Visual Studio и вручную установить входы компоновщика для внешнего библиотека (python37.lib), безуспешно.

Мой вопрос: Как лучше всего решить эту проблему?

И во-вторых, хотя и не так в качестве важного: Существует ли подход, который будет работать на кроссплатформенном уровне, для объединения всех зависимостей в одну единственную 'master' библиотеку stati c?

Вот уменьшенные версии созданных мной CMakeLists .

Заранее спасибо.

CMakeLists.txt для "lib"

cmake_minimum_required(VERSION 3.16)
project(lib)

SET (LIB_FOLDER "${PROJECT_SOURCE_DIR}")
SET (LIB_VENDOR_FOLDER  "${LIB_FOLDER}/vendor")
SET (LIB_SOURCE_FOLDER "${LIB_FOLDER}/source")

# external lib
add_library(
    python-3-7-7
    STATIC IMPORTED
)
set_property(TARGET python-3-7-7 PROPERTY IMPORTED_LOCATION "CORRECT_PATH_TO_LIB/python-3-7-7.lib")

add_library(
    lib
    STATIC
    # list of source files
    # ......
)

#includes
target_include_directories(
    lib
    PRIVATE ${LIB_FOLDER} 
    PRIVATE ${LIB_VENDOR_FOLDER} 
    # ......
)
# linkage
target_link_libraries(lib python-3-7-7)

CMakeLists.txt для "framework"

cmake_minimum_required(VERSION 3.16)
project(framework)

SET (FRAMEWORK_FOLDER "${PROJECT_SOURCE_DIR}")
SET (FRAMEWORK_SOURCE "${FRAMEWORK_FOLDER}/source")
SET (FRAMEWORK_VENDOR_FOLDER  "${FRAMEWORK_FOLDER}/vendor")

# -------------- OPEN GL ---------------------
find_package(OpenGL REQUIRED)
# -------------- OPEN GL ---------------------

# ---------------GLEW START-------------------
# glew-2.1.0
SET (GLEW_FOLDER  "${FRAMEWORK_VENDOR_FOLDER}/glew-2.1.0")
SET (GLEW_INCLUDE_FOLDER  "${GLEW_FOLDER}/include")
SET (GLEW_SOURCE_FOLDER  "${GLEW_FOLDER}/src")

add_library(
    glew32s 
    ${GLEW_SOURCE_FOLDER}/glew.c
)
target_compile_definitions(glew32s PRIVATE GLEW_STATIC)
target_include_directories(glew32s PRIVATE ${GLEW_INCLUDE_FOLDER})
# ---------------GLEW END--------------------

# ---------------GLFW START-------------------
# glfw-3.3
SET(GLFW_FOLDER "${FRAMEWORK_VENDOR_FOLDER}/glfw-3.3")
SET(GLFW_INCLUDE_FOLDER "${GLFW_FOLDER}/include")
add_subdirectory(${GLFW_FOLDER})
# ---------------GLFW END-------------------

# ---------------LIB START-------------------
add_subdirectory(${FRAMEWORK_FOLDER}/lib)
# ---------------LIB END---------------------

# ---------------FRAMEWORK START-------------------
add_library(
    framework

    # source
    ${FRAMEWORK_SOURCE}/App.cpp
    # .....

    # headers
    ${FRAMEWORK_SOURCE}/App.h
    # .....
)

target_compile_definitions(
   framework 
   PRIVATE GLEW_STATIC
)

target_include_directories(
    framework
    PRIVATE ${FRAMEWORK_SOURCE} 
    PRIVATE ${GLEW_INCLUDE_FOLDER}
    PRIVATE ${GLFW_INCLUDE_FOLDER}
   # ....
)

target_link_libraries(
    framework 
    PUBLIC lib
    PUBLIC glfw ${GLFW_LIBRARIES} 
    PUBLIC glew32s 
    PUBLIC ${OPENGL_gl_LIBRARY}
)
# ---------------FRAMEWORK END-------------------

CMakeLists.txt для "exe"

cmake_minimum_required(VERSION 3.16)
project(sandbox)

SET (SANDBOX_FOLDER "${PROJECT_SOURCE_DIR}")
SET (SANDBOX_SOURCE "${SANDBOX_FOLDER}/source")

add_subdirectory(${SANDBOX_FOLDER}/framework)

# ------------ SANDBOX START -------------
add_executable(
    sandbox
    ${SANDBOX_SOURCE}/Bootstrap.cpp
    ${SANDBOX_SOURCE}/FrameworkApp.cpp

    # headers
    ${SANDBOX_SOURCE}/FrameworkApp.h
)

target_link_libraries(
    sandbox
    framework # also tried just linking against this and remove the ones below
    lib
    glew32s
    glfw ${GLFW_LIBRARIES}
)

target_include_directories(
    sandbox
    PRIVATE ${SANDBOX_SOURCE}
    # ....
)

target_compile_definitions(sandbox PRIVATE GLEW_STATIC)
# ------------ SANDBOX END ---------------
...