[CMake] How to link shared lib on windows (visual studio 2014).

J. Caleb Wherry calebwherry at gmail.com
Mon Apr 25 21:41:22 EDT 2016


(1)

You typically want to define the entry point in the source itself. You can
use the 'CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS' in CMake but you usually do
something like this in the source:

#ifdef WIN32
#define PUBLIC_API __declspec(dllexport)
#else
#define PUBLIC_API
#endif

PUBLIC_API void HelloFunc();

That way when you are building a shared lib on windows it will export those
symbols which in turn creates the .lib. Without the exported symbols, you
will not have an import lib.

(2)

The missing DLL is a pain that you are just going to have to deal with
unless you want to do a bunch of voodoo with the registry or copy the DLLs.
Typically, there are POST_BUILD steps that copy the needed DLLs into the
same directory as the exe. There are many stackoverflow questions dealing
with this, first one googled here:

http://stackoverflow.com/questions/5765986/how-can-i-run-an-exe-with-dlls-in-separate-directory

-Caleb


On Mon, Apr 25, 2016 at 9:01 PM, Chaos Zhang <zcsd2012 at gmail.com> wrote:

> Hi,
>
> I faced this problem when i try built a shared lib  and linked it on
> windows. The structure of my project as below:
> -test_dir/
>      -sub_hello/
>            CMakeLists.txt
>            hello.c
>      -top/
>            main.c
>            CMakeLists.txt
>      CMakeLists.txt
>
> The content of each file:
> ①test_dir/CMakeLists.txt:
> PROJECT(TESTLIB)
> add_subdirectory(sub_hello sub_hello)
> add_subdirectory(top top)
>
> ②test_dir/sub_hello/CMakeLists.txt:
> message("message from sub_hello")
> add_library(hello_lib  SHARED hello.c)
>
> ③test_dir/top/CMakeLists.txt:
> include_directories(../sub_hello)
> add_executable(main main.c)
> target_link_libraries(main hello_lib)
>
> ④test_dir/sub_hello/hello.c:
> #include <stdio.h>
> void HelloFunc()
> {
>         printf("###hello###\n");
> }
>
> ⑤test_dir/top/main.c:
> int main()
> {
>         HelloFunc();
>         return 0;
> }
>
> After i cmake this project, generated .sln and .proj files, then i built it
> and i get an error in vs:
>
> Error   LNK1104 can't open file "..\sub_hello\Debug\hello_lib.lib"
>
> In folder ..\sub_hello\Debug\ , there was not a hello_lib.lib existed.
> Then i look thorough and found a solution:
>
> Add "set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS YES)" in file
> test_dir/sub_hello/hello.c
>
> Then i built this solution again, this time it success, and hello_lib.lib
> and main.exe was generated. But when i try to run main.exe, an error
> occured: "lose hello_lib.dll". And i moved hello_lib.dll into the folder of
> main.exe, and it worked well.
>
> There are two questions i could not figure out:
> ①Is this "..\sub_hello\Debug\hello_lib.lib" associates with
> "..\sub_hello\Debug\hello_lib.dll"? For windows can not use .dll directly,
> and use a .lib to record the .dll's  entrance and location.
> ②How to solve the problem of main.exe can not find .dll file.
>
> Best regards,
> Chao Zhang
>
>
>
>
>
> --
> View this message in context:
> http://cmake.3232098.n2.nabble.com/How-to-link-shared-lib-on-windows-visual-studio-2014-tp7593346.html
> Sent from the CMake mailing list archive at Nabble.com.
> --
>
> 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




-- 
J. Caleb Wherry
*Scientific Software Engineer*

<http://www.calebwherry.com>
http://www.calebwherry.com
+1 (615) 708-5651
calebwherry at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160425/5fe5042f/attachment-0001.html>


More information about the CMake mailing list