【问题标题】:C++ Link two Shared Library to main.cppC++ 将两个共享库链接到 main.cpp
【发布时间】:2017-07-20 18:38:04
【问题描述】:

我在尝试将两个共享库链接到 cmake 文件中的 main.cpp 文件时遇到了一些问题。

我的文件夹树是:

**mainfolder**
    |_main.cpp
    |_CMakeLists.txt
    |
    | **lib**
         |_**lib1**
              |_CMakeLists.txt
              |_liblib1.so
              |_**src**
                   |_lib1.cpp
              |_**include**
                   |_lib1.h
         |_**lib2**
              |_CMakeLists.txt
              |_liblib2.so
              |_**src**
                   |_lib2.cpp
              |_**include**
                   |_lib2.h

这两个库的两个CMakeLists.txt非常相似,都是根据this link创建的:

cmake_minimum_required(VERSION 2.6)
project( LibraryLib1 C CXX )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
set(CMAKE_BUILD_TYPE Release)
find_package( OpenCV REQUIRED )
# Find source files
file(GLOB SOURCES src/*.cpp)
# Include header files
include_directories(include)
# Create shared library
add_library(${PROJECT_NAME} SHARED ${SOURCES})
# Install library
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME})
# Install library headers
file(GLOB HEADERS include/*.h)
install(FILES ${HEADERS} DESTINATION include/${PROJECT_NAME})

我的 main.cpp 文件是:

#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
#include "lib/lib1/lib1.h"
#include "lib/lib2/lib2.h"

using namespace cv;

int main()
{
    printf("Executing main.cpp");

    lib1 lib1object;
    lib2 lib2object;

    for(;;)
    {

         lib1object.Analize(param1, param2);
         lib2object.Draw(param1, param2, param3);
    }
    return 0;
}

我的 main.cpp 应该调用 openCV + 两个库。您能否告诉我必须将哪一行添加到主文件夹中的 CMakeLists.txt 才能运行我的主目录?

此时主文件夹/CMakeLists.txt 是:

cmake_minimum_required(VERSION 2.8)
project( MyProject C CXX )
find_package( OpenCV REQUIRED )
add_executable( main main.cpp )
target_link_libraries( main ${OpenCV_LIBS})

非常感谢您的帮助。谢谢!!

还有一件事...如果我将 mainfolder/CMakeLists.txt 的最后一行修改为:

target_link_libraries( main ${OpenCV_LIBS} LibraryLib1 LibraryLib2)

其中LibraryLib1和LibraryLib2是两个库项目的名称,我得到:

/usr/bin/ld: unable to find -lLibraryLib1
/usr/bin/ld: unable to find -lLibraryLib2

【问题讨论】:

  • 欢迎来到 StackOverflow。您能否添加您收到的错误消息?看来您缺少include_directories( ${OpenCV_INCLUDE_DIRS} )
  • 问题与OpenCV无关...我只需要知道如何包含两个.so库的目录,这样我的主文件就可以找到两个函数Analize和Draw
  • @languitar 这两个库是按照该帖子中的建议创建的
  • 请提供一个最小的工作示例 (CMakeLists.txt),它可以重现您在自己的库中看到的错误。没有那个很难说。

标签: opencv c++11 makefile cmake shared-libraries


【解决方案1】:

库和主文件有单独的项目。因此,主文件不知道其他项目的目标名称。最简单的解决方案(因为一切都在一个源代码树中)是只有一个项目。

因此,使用add_subdirectory 直接在主项目中构建您的库:

cmake_minimum_required(VERSION 2.8)
project( MyProject C CXX )
add_subidrectory(lib/lib1)
add_subidrectory(lib/lib2)
find_package( OpenCV REQUIRED )
add_executable( main main.cpp )
target_link_libraries( main ${OpenCV_LIBS} LibraryLib1 LibraryLib2)

这确保了目标名称是已知的。这假设您在 add_library(LibraryLib1... 等子文件夹中有调用。否则,请适当地交换名称。

【讨论】:

  • 嗨 languitar,首先感谢您的回答......它工作正常......我现在的问题是:如果我修改 main.cpp,它会重新编译所有库吗?因为我想加快进程而不重新编译未修改的文件(例如库)
  • 不,CMake 会处理这个问题。
  • 如果它适合你,请你接受这个答案。
  • 另一个问题:如果我想将这两个库编译为静态而不是动态,我必须改变什么?
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2015-10-08
相关资源
最近更新 更多