[CMake] CMAKE_SHARED_LIBRARY_PREFIX is blank on msvc?

David Manura dm.lua at math2.org
Sat Nov 14 19:01:23 EST 2009


CMAKE_SHARED_LIBRARY_PREFIX is blank on MSVC, unlike on most platforms
(MinGW included):

  $ (cd cmake-2.8.0/Modules/Platform/ && grep -re CMAKE_SHARED_LIBRARY_PREFIX .)
  ./AIX.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")          # lib
  ./BlueGeneL.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")          # lib
  ./Catamount.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")          # lib
  ./CYGWIN-g77.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")
  ./CYGWIN.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "cyg")
  ./Darwin-icc.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")
  ./Darwin.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")
  ./eCos.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")          # lib
  ./Generic-SDCC-C.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "")          # lib
  ./Windows-g77.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")          # lib
  ./Windows-gcc.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")          # lib
  ./Windows.cmake:SET(CMAKE_SHARED_LIBRARY_PREFIX "")          # lib

The conflict I'm running into is as follows.  I have a scripting
language (Lua) that loads a pluggable module "foo", which in turns
loads and provides a scripting interface for a system library "foo".
On most platforms, the system library is named "libfoo.so" and located
in the system library search path, and the module is named "foo.so"
and located in the scripting language's search path "modules" (which
may or may not, typically not, be in the system library search path).
Now, on Windows at least, the scripting language dynamically loads
"modules/foo.dll", which in turns attempts to statically load the
system library "foo.dll" (without a path name), but Windows sees that
a "foo.dll" is already loaded and therefore returns "modules/foo.dll"
instead, causing breakage.

Now, there may be ways around this [2], but the simplest solution is
to just rename the system library to "libfoo.dll".  CMake does that
for MinGW, but why not MSVC?  I'd prefer not to add a prefix on the
pluggable modules, which would be atypical.

As a workaround, I may add this to a common file included in all my projects:

  if(MSVC)
    set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
  endif(MSVC)

[1] http://msdn.microsoft.com/en-us/library/ms684179%28VS.85%29.aspx -
"If lpFileName does not include a path and there is more than one
loaded module with the same base name and extension, the function
returns a handle to the module that was loaded first."
[2] http://stackoverflow.com/questions/107888/is-there-a-windows-msvc-equivalent-to-the-rpath-linker-flag


More information about the CMake mailing list