我有一个利用共享库的c ++项目,其中一些具有自己的依赖性。但是,我被迫在main.cpp文件中包括共享库依赖项的头文件。我以为这是我的项目结构问题,但我不确定。
项目结构:
- myproject
|-> foo1
|-> include
|-> foo1_stuff.hpp
|-> src
|-> main.cpp
|-> build
|-> CMakeLists.txt
|-> foo2
|-> include
|-> foo2_stuff.hpp
|-> src
|-> main.cpp
|-> build
|-> CMakeLists.txt
|-> lib
|-> bar
|-> include
|-> bar.hpp
|-> src
|-> bar.cpp
|-> bar_tool
|-> include
|-> bar_tool.hpp
|-> src
|-> bar_tool.cpp
|-> CmakeLists.txt
foo1的main.cpp:
#include <bar_tool.hpp>
int main()
{
bar_tool tool;
tool.doStuff();
return 0;
}
bar_tool.hpp:
#include <bar.hpp>
class bar_tool
{
public:
bar_tool();
~bar_tool();
int var;
void doStuff();
};
bar_tool.cpp:
#include <iostream>
#include <bar_tool.hpp>
bar_tool::bar_tool() : var(0) {}
bar_tool::~bar_tool() {}
void bar_tool::doStuff()
{
std::cout << barFunction(var) << std::endl;
}
bar.cpp:
int barFunction(int value)
{
return value + 2;
}
Foo1 CMakeLists:
cmake_minimum_required(VERSION 3.10.2)
project(foo)
set(PROJECT_ROOT ~/myproject/)
set(
CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)
link_directories(
/usr/local/lib
/usr/lib
${PROJECT_ROOT}/lib
)
include_directories(
include
${PROJECT_ROOT}/lib/bar_tool/include
)
file(GLOB SOURCES "src/*.cpp")
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
${PROJECT_NAME}
bar_tool
)
共享库CMakeList:
cmake_minimum_required(VERSION 3.10.2)
project(myproject)
set(PROJECT_ROOT ~/myproject/)
set(
CMAKE_LIBRARY_OUTPUT_DIRECTORY
${PROJECT_ROOT}/lib/
)
link_directories(
/usr/local/lib
/usr/lib
${PROJECT_ROOT}/lib
)
include_directories(
include
${PROJECT_ROOT}/lib/bar/include
${PROJECT_ROOT}/lib/bar_tool/include
)
# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_link_libraries(
${LIB_NAME}
bar
)
我希望使用已编译的bar_tool共享库(libbar_tool.so
)不需要在foo1的CMakeLists的bar.hpp
部分中包含include_directories
。但是,如果没有,则会出现以下错误:
In file included from /home/mrd/Development/compile_test/foo/src/main.cpp:1:0:
/home/mrd/Development/compile_test/lib/bar_tool/include/bar_tool.hpp:1:10: fatal error: bar.hpp: No such file or directory
#include <bar.hpp>
^~~~~~~~~
compilation terminated.
我是否没有正确使用共享库或CMake(或两者)?
FIX:
更新:共享库CMakeList:
cmake_minimum_required(VERSION 3.10.2)
project(myproject)
set(PROJECT_ROOT ~/myproject/)
set(
CMAKE_LIBRARY_OUTPUT_DIRECTORY
${PROJECT_ROOT}/lib/
)
# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
${LIB_NAME} PUBLIC
${PROJECT_ROOT}/lib/bar/include
)
# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
${LIB_NAME} PUBLIC
${PROJECT_ROOT}/lib/bar_tool/include
)
target_link_libraries(
${LIB_NAME} PUBLIC
bar
)
不确定这是否有效果,但我也对此进行了更改:
更新 Foo1 CMakeList:
cmake_minimum_required(VERSION 3.10.2)
project(foo)
set(PROJECT_ROOT /home/mrd/Development/compile_test)
set(
CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)
add_subdirectory(${PROJECT_ROOT}/lib/ bin)
file(GLOB SOURCES "src/*.cpp")
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
${PROJECT_NAME}
bar_tool
)
欢迎其他任何建议!
答案 0 :(得分:0)
由于具有已编译的库,因此无需添加源文件的路径。 所有函数调用,外部变量访问等都将链接到此预编译的库。
当您包含头文件时,情况并非如此。 Make会在编译之前尝试创建所有依赖项的列表,以查找所有标头。 因此,必须提供直接或间接包含的所有标头的路径。
答案 1 :(得分:0)
在您的共享库CMakeLists.txt
文件中,考虑添加PUBLIC
关键字,以确保将传递依赖项(即bar
库)传播到最终目标。另外,现代CMake鼓励使用target_include_directories()
而不是include_directories()
。同样,您还应该在此处添加PUBLIC
关键字:
target_include_directories(bar PUBLIC
${PROJECT_ROOT}/lib/bar/include
)
target_include_directories(bar_tool PUBLIC
${PROJECT_ROOT}/lib/bar_tool/include
)
target_link_libraries(
${LIB_NAME} PUBLIC
bar
)