Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从静态c和c创建共享c库++;图书馆? 总结_C++_C_Cmake_Shared Libraries_Static Libraries - Fatal编程技术网

C++ 如何从静态c和c创建共享c库++;图书馆? 总结

C++ 如何从静态c和c创建共享c库++;图书馆? 总结,c++,c,cmake,shared-libraries,static-libraries,C++,C,Cmake,Shared Libraries,Static Libraries,我正在将基于c/c++的静态库集成到基于c的共享库中(在linux上使用cmake)。 我有这样的错误:libmylib.so:std::ios_base::Init::Init()的未定义引用。 该问题与C++的使用以及与共享库的连接密切相关。如果我避开共享库(甚至是另一个静态库),则不会发生错误。由于我的项目我无法避免使用静态库的共享库 如何从c/c++静态库和新的c源代码生成正确共享的库? PD:很抱歉问了这么长的问题,我发布代码是为了让你了解我的问题 C++代码 cppexample.h

我正在将基于c/c++的静态库集成到基于c的共享库中(在linux上使用cmake)。

我有这样的错误:
libmylib.so:std::ios_base::Init::Init()的未定义引用。

该问题与C++的使用以及与共享库的连接密切相关。如果我避开共享库(甚至是另一个静态库),则不会发生错误。由于我的项目我无法避免使用静态库的共享库

如何从c/c++静态库和新的c源代码生成正确共享的库?

PD:很抱歉问了这么长的问题,我发布代码是为了让你了解我的问题

C++代码 cppexample.hpp

typedef结构cpp_api
{
int(*func_ptr)(常量字符*,int);
}cpp_api;
#ifdef_uucplusplus
外部“C”{
#恩迪夫
常量cpp_api*getApi();
#ifdef_uucplusplus
}
#恩迪夫
cppexample.cpp

int-apiFunc(常量字符*strc,int值)
{
std::字符串str(strc);

STD::CUT> P>您得到了未定义的引用,因为<代码> MyLIB < /C>库是强>链接为c<强/>对象。但是由于静态库<代码> LBMIN LIB。A/EXC>是C++的一个,它需要C++链接。 这种不正确的链接是因为第二个代码中的库
mainlib
静态的
导入的
(这两个关键字都很重要),而CMake不知道该库的实际语言

你需要提示cFAUL,因为库实际上是C++的,需要C++链接:

set_property(TARGET mainlib PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES CXX)

您的第一个代码工作正常,因为它的代码>主库< /COD>库,它不是静态的,不是代码>导入< /COD>一个,CFALE知道它的来源。作为源代码<代码> CPP.CPP < /C>绝对是C++的,CMake把代码>主语BI/<代码>库作为C++。< /P>这行TAGTIONLKKL库(${}{MyLIB))您是否尝试链接到mainlib?@user3389943是目标链接库(mylib mainlib)我正在尝试将mainlib链接到mylib,以便在其他项目中使用mylib。是否可以要求重新编译静态库的版本?我的情况与我需要了解的情况类似。因此,文件来自二进制分布式静态库。经过数天的研究和尝试,该库仅被证明缺少关键com为我的目标堆积选项。我最终要经过一个更长的过程才能获得库源代码的读取权限非常感谢!这帮助我发现我还需要在“libmainlib.pc”中添加“Libs.private:-lstdc++”文件如果您的库有

.pc
文件,您也可以在CMake中使用此库。由于CMake 3.6此命令可能会生成导入的目标,因此您只需将该目标传递到
目标链接库
,一切都将正常工作。
#include "example.h"
#include "cpp_lib/cppexample.hpp"

void doSomething()
{
  const cpp_api *api = getApi();
  int result = api->func_ptr("hello!", 12);
}
void callDoSomething();
#include "mainApi.h"
#include "mix_lib/example.h"

void callDoSomething()
{
  doSomething();
}
#include "mainApi.h"
int main(int argc, const char* argv[])
{
  callDoSomething();
  return 0;
}
cmake_minimum_required(VERSION 3.5)
set(CMAKE_BUILD_TYPE "Release") #Not debug
set(THIS MAINLIB) #project name
project(${THIS} C CXX) #For c and c++
set(CMAKE_C_STANDARD 99) #c99
set(CMAKE_CXX_STANDARD 11) #c++11
set(CMAKE_POSITION_INDEPENDENT_CODE ON) #fPIC

set(MAIN_LIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")

###### MAIN LIB ######
include_directories(${MAIN_LIB_ROOT} ${MAIN_LIB_ROOT}/main) 
list(APPEND MAIN_LIB_SOURCES
            "${MAIN_LIB_ROOT}/main/mainApi.h"
            "${MAIN_LIB_ROOT}/main/mainApi.c")
set(MAIN_LIB_NAME mainlib)
add_library(${MAIN_LIB_NAME} STATIC ${MAIN_LIB_SOURCES})
include("${MAIN_LIB_ROOT}/cpp_lib/cpp_lib.cmake")
include("${MAIN_LIB_ROOT}/mix_lib/mix_lib.cmake")
setup_cpp_lib()
setup_mix_lib()

###### MAIN EXECUTABLE ######
add_executable(${THIS} "${MAIN_LIB_ROOT}/main.c")
target_link_libraries(${THIS} PUBLIC ${MAIN_LIB_NAME})
list(APPEND MAIN_INSTALL_BINS 
            ${THIS})
list(APPEND CPP_LIB_SOURCES
            "${MAIN_LIB_ROOT}/cpp_lib/cppexample.hpp"
            "${MAIN_LIB_ROOT}/cpp_lib/cppexample.cpp")

function(setup_cpp_lib)
  add_library(cpplib OBJECT ${CPP_LIB_SOURCES})
  target_sources(${MAIN_LIB_NAME} PRIVATE $<TARGET_OBJECTS:cpplib>)
endfunction()
list(APPEND MIX_LIB_SOURCES
            "${MAIN_LIB_ROOT}/mix_lib/example.h"
            "${MAIN_LIB_ROOT}/mix_lib/example.c")

function(setup_mix_lib)
  add_library(mixlib OBJECT ${MIX_LIB_SOURCES})
  target_sources(${MAIN_LIB_NAME} PRIVATE $<TARGET_OBJECTS:mixlib>)
endfunction()
cmake_minimum_required(VERSION 3.5)
set(CMAKE_BUILD_TYPE "Release") #Not debug
set(THIS MYPROJECT) #project name
project(${THIS} C CXX) #For c only
set(CMAKE_C_STANDARD 99) #c99
set(CMAKE_CXX_STANDARD 11) #c++11
set(MAIN_LIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") #current cmakelists path

include_directories(${MAIN_LIB_ROOT}/includes) #includes for library headers
add_library(mylib SHARED "${MAIN_LIB_ROOT}/main.c")
add_library(mainlib STATIC IMPORTED)
set_property(TARGET mainlib PROPERTY IMPORTED_LOCATION ${MAIN_LIB_ROOT}/lib/libmainlib.a)
target_link_libraries(mylib mainlib)
add_executable(${THIS} "${MAIN_LIB_ROOT}/main.c")
target_link_libraries(${THIS} mylib)

list(APPEND MAIN_INSTALL_BINS ${THIS})
install(TARGETS ${MAIN_INSTALL_BINS} DESTINATION "${CMAKE_INSTALL_PREFIX}")
libmylib.so: undefined reference to `std::ios_base::Init::Init()'
libmylib.so: undefined reference to `std::string::_Rep::_M_destroy(std::allocator<char> const&)'
libmylib.so: undefined reference to `std::string::_Rep::_S_empty_rep_storage'
libmylib.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
collect2: error: ld returned 1 exit status
make[2]: *** [MYPROJECT] Error 1
make[1]: *** [CMakeFiles/MYPROJECT.dir/all] Error 2
make: *** [all] Error 2
set_property(TARGET mainlib PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES CXX)