Compile shared library and call it's functions

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Compile shared library and call it's functions

Ivan
Hello!
I hope someone could finally help me. I spent about two days to find solution for my problem, but with no luck.

Here is my problem:

I want to create a shared library (dll on Windows, .so on Linux, .dylib on OS X) that contains some functions. This library should export only these functions and nothing else. I guarantee that these function are pure C functions, so no C++ STL is needed to call them.

Then I want to create an application that call functions from the shared library mentioned above. I mean that the application should not have these functions inside. I want OS linker to link the application with the library at runtime, when it initializes the application. I know, how to do this on Windows with Visual Studio: create DLL project, write functions and compile, then there will be two files: .dll and .lib, link the .lib file with the application and at runtime Windows will find the .dll. But how can I do so with CMake?

Here is my CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)
project(untitled19)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(LIBRARY_SRC library.cpp)

add_library(libra SHARED ${LIBRARY_SRC})

set(SOURCE_FILES main.cpp)
add_executable(untitled19 ${SOURCE_FILES})
target_link_libraries(untitled19 libra)

This works and both library and executable are compiled. Unfortunately library seems to be linked into the executable: ‘nm’ command shows that the executable itself exports needed functions!
I think there should be a solution for this, but I cannot find it. Can anyone help me?
For more clarification: I’m using OS X El Capitan.
——
Best regards, Ivan.



--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Compile shared library and call it's functions

Andreas Pakulat-2
Hi,

On Mon, Mar 7, 2016 at 9:29 PM, Ivan <[hidden email]> wrote:
Hello!

Here is my CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)
project(untitled19)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(LIBRARY_SRC library.cpp)

add_library(libra SHARED ${LIBRARY_SRC})

set(SOURCE_FILES main.cpp)
add_executable(untitled19 ${SOURCE_FILES})
target_link_libraries(untitled19 libra)

This works and both library and executable are compiled. Unfortunately library seems to be linked into the executable: ‘nm’ command shows that the executable itself exports needed functions!

I do not think your interpreting the nm output correctly, but its hard to say without seeing it ;)

Note that nm will show the functions exported by the library in the output for the executable, because the executable uses those functions. It will also indicate however that these functions are not defined inside the executable in the corresponding column with an upper-case U. When you run nm on the library itself you will notice that the same symbols have a different type in the corresponding column. In addition you can verify that the executable actually links against the library using the otool commandline tool: otool -L executable.

Andreas

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Compile shared library and call it's functions

Jakob van Bethlehem
In reply to this post by Ivan
Hej,

A short side-question - you mentioned you are compiling a DLL, yet you mention also you are on OSX. I'd expect a .dylib on OSX?
Anywaysz, I think Andreas already answered your question quite clearly: you probably misinterpret the output of nm, since your CMakeLists.txt file looks exactly as it should.

Sincerely,
Jakob



On Mon, Mar 7, 2016 at 9:29 PM, Ivan <[hidden email]> wrote:
Hello!
I hope someone could finally help me. I spent about two days to find solution for my problem, but with no luck.

Here is my problem:

I want to create a shared library (dll on Windows, .so on Linux, .dylib on OS X) that contains some functions. This library should export only these functions and nothing else. I guarantee that these function are pure C functions, so no C++ STL is needed to call them.

Then I want to create an application that call functions from the shared library mentioned above. I mean that the application should not have these functions inside. I want OS linker to link the application with the library at runtime, when it initializes the application. I know, how to do this on Windows with Visual Studio: create DLL project, write functions and compile, then there will be two files: .dll and .lib, link the .lib file with the application and at runtime Windows will find the .dll. But how can I do so with CMake?

Here is my CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)
project(untitled19)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(LIBRARY_SRC library.cpp)

add_library(libra SHARED ${LIBRARY_SRC})

set(SOURCE_FILES main.cpp)
add_executable(untitled19 ${SOURCE_FILES})
target_link_libraries(untitled19 libra)

This works and both library and executable are compiled. Unfortunately library seems to be linked into the executable: ‘nm’ command shows that the executable itself exports needed functions!
I think there should be a solution for this, but I cannot find it. Can anyone help me?
For more clarification: I’m using OS X El Capitan.
——
Best regards, Ivan.



--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake