编写多平台汇编的cmake文件时出现问题。详细信息:为了方便工作,我将项目分成几个库。我将数据库访问库移至单独的 dll 中。我会立即进行预订 - 如果所有模块都在主程序的主体中,那么它们都可以工作,也就是说,那里没有错误(目前:))
为了构建该项目,我创建了一个新的 cmake 项目,该项目作为子项目包含在主项目中:
cmake_minimum_required(VERSION 3.5)
project(plgconnector LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if (WIN32)
message("[PLG CONNECTOR] Build Windows revision!")
find_package(QT NAMES Qt5 COMPONENTS Widgets Core svg REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core svg Widgets REQUIRED)
find_package(PostgreSQL REQUIRED)
endif(WIN32)
if (UNIX AND NOT APPLE)
message("[PLG CONNECTOR] Build Linux revision!")
find_package(QT NAMES Qt5 COMPONENTS Core Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets REQUIRED)
find_package(PostgreSQL REQUIRED)
endif()
message("[PLG CONNECTOR] PostgreSQL VER: " ${PostgreSQL_VERSION_STRING})
message("[PLG CONNECTOR] Include files PostgreSQL: " ${PostgreSQL_INCLUDE_DIRS})
message("[PLG CONNECTOR] Lib files PostgreSQL: " ${PostgreSQL_LIBRARY_DIRS})
add_library(plgconnector SHARED
plgconnector_global.h
tconnector.cpp
tnotifyer.cpp
tquery.cpp
treader.cpp
tconnector.h
pgerror.ui
pgerror.h
pgerror.cpp
sqlhighlighter.h
sqlhighlighter.cpp
sqlloghlighter.h
sqlloghlighter.cpp
)
include_directories(AFTER ${PostgreSQL_INCLUDE_DIRS})
link_directories(AFTER ${PostgreSQL_LIBRARY_DIRS} ${PLG_LIB})
if (WIN32)
target_link_libraries(plgconnector Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Widgets
"${PostgreSQL_LIBRARY_DIRS}/libpq.lib"
)
endif(WIN32)
if (UNIX AND NOT APPLE)
target_link_libraries(plgconnector Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Widgets pq)
endif()
target_compile_definitions(plgconnector PRIVATE PLGCONNECTOR_LIBRARY)
set_target_properties(plgconnector PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${PlatformDir}"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${PlatformDir}"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${PlatformDir}"
)
上面的项目文本可以正常工作,但我有一个问题。在我之前写的主项目中
if (WIN32)
target_link_libraries(plgconnector Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Widgets libpq
)
endif(WIN32)
并且该项目组装组装都很正常,一切都很好。但是如果我只是在这里写libpq,那么在链接阶段我会收到一个错误,提示找不到该文件,但是如果我直接指定路径,那么一切都很好。此外,这个门框仅适用于 WIN32;在 Linux 中一切正常。
我不明白我做错了什么。毕竟有一段添加代码:
link_directories(AFTER ${PostgreSQL_LIBRARY_DIRS} ${PLG_LIB})
有人有什么想法吗?
UPD: MS VC 2022 用于 Windows 中的汇编。
该命令
link_directories仅影响在其之后创建的目标。由于目标plgconnector是在调用 之前在代码中创建的(通过调用add_library)link_directories,因此不会添加库搜索目录。link_directories一种解决方案是在创建目标之前转移调用:但一般情况下,
link_directories不建议使用,但最好只将完整路径传输到target_link_libraries. 如果您不想硬编码 libpq 库扩展,可以在指定目录中搜索该库: