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

J. Caleb Wherry calebwherry at gmail.com
Mon Apr 25 22:29:24 EDT 2016


Altering the path, updating the registry, or having a custom install step
that installs into a build location are all options that aren't scalable
since they apply specifically to the one project. Paths would get huge if
this was to be done in practice for multiple projects.

Also, the OP seems to building from VS so being able to press F5 and
everything just work is nice. Adding a POST_BULLD step that copies the DLL
to the build location of the exe is the best way to solve the problem.

Lastly, adding an install step just muddles what "install" means, IMO. You
aren't really installing anything, you are just building a project and you
want it to run after building. Installing brings a lot more baggage and
using it here seems like a bad idea.

-Caleb

On Monday, April 25, 2016, J Decker <d3ck0r at gmail.com> wrote:

>
> On Apr 25, 2016 6:41 PM, "J. Caleb Wherry" <calebwherry at gmail.com
> <javascript:_e(%7B%7D,'cvml','calebwherry at gmail.com');>> wrote:
> >
> > (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:
> >
>
> Could just set the path environment variable... No registry hack.. Or
> include install rules and just build install before running.
> >
> 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
> <javascript:_e(%7B%7D,'cvml','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
> > +1 (615) 708-5651
> > calebwherry at gmail.com
> <javascript:_e(%7B%7D,'cvml','calebwherry at gmail.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
>


-- 
Sent from my iPhone 4s
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160425/0d69db52/attachment-0001.html>


More information about the CMake mailing list