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

Chaos Zhang zcsd2012 at gmail.com
Tue Apr 26 20:13:15 EDT 2016


Thanks again Mr. Atkins.

Chuck Atkins wrote
> May others have mentioned the various different ways to address generating
> import libraries.  One thing that will help with the "can't find .dll"
> issue is to change the default location that various components end up.
> With Windows shared libraries, you have both a runtime component (.dll)
> and
> a link time component (.lib).  Setting the following at the top of your
> CMakeLists.txt:
> 
> if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
>   set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
> endif()
> if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
>   set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
> endif()
> if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
>   set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
> endif()
> 
> This is a common pattern to place near the beginning of a top-level
> CMakeLists.txt after the project(...) copmmand.  What this does is make
> sure that all runtime components end up in the bin directory, including
> both .exe's and .dll's, and that all link-time components, including .so's
> and .a's in Linux and .lib's on Windows, end up in the the lib directory.
> This way when you run your executable on Windows, their necessary runtime
> components live next to them.  It also consolidates all your build
> products
> into one place instead of leaving them scattered across the various
> sub-directories of the build folder.
> 
> - Chuck
> 
> On Tue, Apr 26, 2016 at 9:22 AM, Chaos Zhang <

> zcsd2012@

> > wrote:
> 
>> Hi, all,
>>
>> Thanks for your sincerely help, and i understand it clearly now. ( ^_^ )
>>
>> Best regards,
>> Chao
>>
>>
>> J. Caleb Wherry wrote
>> > (Shameless plug ahead)
>> >
>> > If you want to see a working example of what I said above, you can
>> check
>> > out my ExampleCMakeProject:
>> >
>> > https://github.com/calebwherry/example-cmake-project
>> >
>> > It is currently being built and tested on TravisCI (Linux + Mac [GGC5
>> and
>> > Clang3.7]) and Appveyor (Windows [VS2015]) and provides a simple
>> example
>> > of
>> > how to write/structure CMake for cross-platform C/C++ projects. You can
>> > ignore the python wrapper if you want, it just makes working with the
>> > CMake
>> > exe and system builds easier (calculates core counts, creates
>> directories
>> > for build, nicer CLI options, etc) since I find the options to CMake to
>> be
>> > very... verbose.
>> >
>> > The POST_BUILD example is here:
>> >
>> >
>> https://github.com/calebwherry/example-cmake-project/blob/master/src/app/test-app/CMakeLists.txt
>> >
>> > If you really are looking to get a one-off project working, Decker's
>> > recommendation about PATH modification is easiest. It's just not
>> something
>> > I think is viable in the long run and doesn't work as an actual
>> solution
>> > to
>> > the problem if you are trying to solve it for many projects.
>> >
>> > -Caleb
>> >
>> > On Mon, Apr 25, 2016 at 9:01 PM, Chaos Zhang <
>>
>> > zcsd2012@
>>
>> > > 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@
>>
>> >
>> > --
>> >
>> > 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
>>
>>
>>
>>
>>
>> --
>> View this message in context:
>> http://cmake.3232098.n2.nabble.com/How-to-link-shared-lib-on-windows-visual-studio-2014-tp7593346p7593361.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
>>
> 
> -- 
> 
> 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





--
View this message in context: http://cmake.3232098.n2.nabble.com/How-to-link-shared-lib-on-windows-visual-studio-2014-tp7593346p7593367.html
Sent from the CMake mailing list archive at Nabble.com.


More information about the CMake mailing list