C++ Link 两个共享库 main.cpp
C++ Link two Shared Library to main.cpp
我遇到了一些问题尝试 link 将两个共享库添加到我的 main.cpp cmake 文件中的文件。
我的文件夹树是:
**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 到 运行 我的主目录吗?
此刻 mainfolder/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
您有单独的库项目和主文件项目。因此,主文件不知道其他项目的目标名称。最简单的解决方案(因为一切都在一个源代码树中)是只有一个项目。
因此,使用 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...
等子文件夹中有调用。否则,适当地交换名称。
我遇到了一些问题尝试 link 将两个共享库添加到我的 main.cpp cmake 文件中的文件。
我的文件夹树是:
**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 到 运行 我的主目录吗?
此刻 mainfolder/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
您有单独的库项目和主文件项目。因此,主文件不知道其他项目的目标名称。最简单的解决方案(因为一切都在一个源代码树中)是只有一个项目。
因此,使用 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...
等子文件夹中有调用。否则,适当地交换名称。