【问题标题】:Single QMake for project and libraries项目和库的单一 QMake
【发布时间】:2023-02-25 01:56:17
【问题描述】:

我有一个创建可执行文件的 Qt5/C++ (Linux) 项目。现在,作为这个项目的一部分,我计划创建许多动态加载的库文件。 (可能有 100 个这样的图书馆)例如,每种动物都有一个图书馆。

我应该为每只动物创建一个单独的项目,例如一个用于创建 dog.so 的项目吗? (或任何 QLibrary 创建的)所以我必须在分发我的应用程序之前创建和编译 100 个项目?

或者,这些应该成为主项目/Qmake 文件的一部分吗?我不确定如何处理这个问题,但我知道每只动物一个项目感觉不对。

【问题讨论】:

  • 查找 qmake 项目文件的 SUBDIRS 模板。它允许您拥有一个构建多个子项目的项目。

标签: qt shared-libraries qmake


【解决方案1】:

为每个动物图书馆创建一个单独的项目将是一种乏味且不切实际的方法。相反,最好将所有动物库包含在同一个项目中,并通过主项目/Qmake 文件管理它们。

为此,您可以为每个动物库创建​​一个单独的子目录,并将每个库的源文件放在其相应的子目录中。然后,使用 SUBDIRS 变量将子目录添加到主项目文件(.pro 文件)。

这是您的 .pro 文件的示例:

TEMPLATE = app

# List all the subdirectories for the animal libraries
SUBDIRS += 
    dog 
    cat 
    bird 
    ...

# Include any other necessary files and libraries
INCLUDEPATH += ...
LIBS += ...

# Specify any necessary build options
QMAKE_CXXFLAGS += ...
QMAKE_LFLAGS += ...

# Specify the output directory for the libraries
LIBS += -L$$PWD/libs

# Specify the names of the libraries to be built
dog.files = $$PWD/libs/libdog.so
cat.files = $$PWD/libs/libcat.so
bird.files = $$PWD/libs/libbird.so
...


使用这种方法,您可以通过运行 qmake 和 make 的单个命令构建所有动物库。生成的库文件将放置在指定的输出目录(例如 libs/)中,并且可以在运行时由您的主应用程序动态加载。

总的来说,这种方法允许您在单个项目文件中管理所有动物库,并使构建和分发应用程序变得更加容易。

更新:

如果每个动物类型库都是从单个 .cpp 文件创建的,则您不必为每个动物类型创建单独的目录。相反,您可以将所有动物 .cpp 文件放在一个目录中,然后使用 Qmake 通过为每个库指定 .cpp 文件的名称来构建每个动物类型库。

下面是一个示例,说明如何修改先前的 Qmake 文件以从单个 .cpp 文件构建每个动物类型库并使用通配符指定动物名称:

TEMPLATE = lib
CONFIG += shared
TARGET = AnimalLibs

# Get a list of all the .cpp files in the animal directory
ANIMAL_SOURCES = $$files(animals/*.cpp)

# Create a library for each animal .cpp file
for(FILE, ANIMAL_SOURCES) {
    # Extract the name of the animal from the file name
    ANIMAL = $$basename($$dirname(FILE))
    # Create the library target for this animal
    LIBNAME = lib$${ANIMAL}.so
    $${ANIMAL}.target = $$LIBNAME
    $${ANIMAL}.sources = $$FILE
    # Add the library target to the list of targets
    SUBDIRS += $$ANIMAL
}

# Build each animal type library
define_build_subdirs {
    for(dir, SUBDIRS) {
        message("Building $$dir")
        SUBDIR = $$dir
        include($$dir/$${SUBDIR}.pro)
    }
}

# Link the libraries to the main project
LIBS += -L$$PWD -l$(ANIMAL) ...

在此示例中,ANIMAL_SOURCES 变量设置为 animals 目录中所有 .cpp 文件的列表。然后 for 循环遍历每个 .cpp 文件并为每种动物类型创建一个库目标。

ANIMAL 变量设置为从目录名称中提取的动物名称。 LIBNAME 变量设置为将要创建的库文件的名称,targetsources 变量设置为特定于动物的目标。

最后,define_build_subdirs 函数用于构建每个动物类型库,并更新 LIBS 变量以将库链接到主项目。

使用这种方法,您可以通过简单地将新的 .cpp 文件添加到动物目录来添加新的动物类型,而无需修改 .pro 文件。新的动物类型将在构建项目时自动构建并链接到主项目

【讨论】:

  • 这行得通吗?这不是使用 SUBDIRS 的方式here。模板不应该是subdirs吗?
  • @JarMan 在 Qt 项目中,有多种方法可以包含库,包括使用 subdirs 模板。 subdirs 模板和其他方法都可以用来实现这个目标。
  • 每个库都将从一个 .cpp 文件创建,是否仍需要为每个文件进入一个目录(以创建 .so)?是否可以对所有动物名称使用通配符,这样我就不必在每次添加动物时都修改 .pro 文件?
  • @TSG 我更新了我的答案。
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多