[CMake] SHARED library containing OBJECT library: Missing -fPIC

Benjamin Eikel cmake at eikel.org
Sun Jun 24 10:05:05 EDT 2012


Hello Leif,

Am Freitag, 22. Juni 2012 um 15:55:55 schrieb Leif Walsh:
> I tried this in my project. I added -fPIC to the COMPILE_FLAGS property of
> the object library and it worked, but then you also get PIC static
> libraries (which isn't that big of a deal). But time your compiles.
> Usually the compilation of individual c files is well dominated by the
> linking time, especially with optimization. So to reduce technical risk, I
> opted just to build each library the old fashioned way and compile objects
> twice. I saw pretty much no compile time difference. But maybe you have
> other reasons.

maybe I did not make things clear enough. I do not want to build the same 
library twice (static and dynamic). I just wanted to know if it is really 
required to add the compiler specific compile flag "-fPIC" manually when using 
object libraries for building a shared library. I know that there will be a 
compiler independent target property in CMake 2.8.9. But nevertheless, being 
forced to add this flags seems somehow cumbersome to me. When building a normal 
shared library composed only of source files, I do not have to add the flag, but 
it is automatically added by CMake.

Kind regards
Benjamin

> 
> Sent from my iPhone
> 
> On Jun 22, 2012, at 5:46, Andreas Naumann <Andreas-Naumann at gmx.net> wrote:
> > I think the latter is the case. It should not be allowed to compose a
> > shared library from OBJECT libraries. What does the cmake developer
> > think about this problem?
> > 
> > Regards,
> > Andreas
> > 
> > Am 22.06.2012 11:14, schrieb Benjamin Eikel:
> >> Hello Andreas,
> >> 
> >> Am Freitag, 22. Juni 2012, 11:09:36 schrieb Andreas Naumann:
> >>> Hello Benjamin,
> >>> 
> >>> if you wants to use an object file for a shared library, this object
> >>> file has to be compiled with -fPIC. I don't think, that it is possible
> >>> to create a shared library from such object files.
> >> 
> >> I know that this is the case. My question is not directed to -fPIC in
> >> general, but to CMake's handling of these files. I want to use CMake's
> >> new OBJECT library feature to structure the build of a library. The
> >> library is built statically as well as dynamically. When building
> >> statically, there is no problem in using the OBJECT libraries of CMake.
> >> But when building dynamically, the problem described in my original
> >> e-mail arises. CMake's documentation does not say that it is not
> >> allowed to use OBJECT libraries to compose shared libraries.
> >> 
> >> Kind regards
> >> Benjamin
> >> 
> >>> Regards,
> >>> Andreas
> >>> 
> >>> Am 22.06.2012 09:50, schrieb Benjamin Eikel:
> >>>> Hello,
> >>>> 
> >>>> I have a problem using an OBJECT library that I want to compile into a
> >>>> SHARED library using CMake version 2.8.8.
> >>>> 
> >>>> Here is a small example that demonstrates my problem:
> >>>> 
> >>>> # --------------- CMakeLists.txt ---------------
> >>>> cmake_minimum_required(VERSION 2.8.8)
> >>>> project(CMakeTest CXX)
> >>>> add_library(MyLibSub OBJECT
> >>>> 
> >>>>          ClassA.cpp
> >>>> 
> >>>> )
> >>>> add_library(MyLib SHARED
> >>>> 
> >>>>          $<TARGET_OBJECTS:MyLibSub>
> >>>>          ClassB.cpp
> >>>> 
> >>>> )
> >>>> 
> >>>> The content of the other four files is more or less irrelevant. To
> >>>> make the example complete, I added them at the end of this e-mail.
> >>>> 
> >>>> When I want to build this example, I get the following error:
> >>>> 
> >>>> $ mkdir build&&   cd build&&   cmake ..&&   make
> >>>> -- The CXX compiler identification is GNU 4.7.0
> >>>> -- Check for working CXX compiler: /usr/bin/c++
> >>>> -- Check for working CXX compiler: /usr/bin/c++ -- works
> >>>> -- Detecting CXX compiler ABI info
> >>>> -- Detecting CXX compiler ABI info - done
> >>>> -- Configuring done
> >>>> -- Generating done
> >>>> -- Build files have been written to: /home/benjamin/Desktop/CMake
> >>>> test/build Scanning dependencies of target MyLibSub
> >>>> [ 50%] Building CXX object CMakeFiles/MyLibSub.dir/ClassA.cpp.o
> >>>> [ 50%] Built target MyLibSub
> >>>> Scanning dependencies of target MyLib
> >>>> [100%] Building CXX object CMakeFiles/MyLib.dir/ClassB.cpp.o
> >>>> Linking CXX shared library libMyLib.so
> >>>> /usr/bin/ld: CMakeFiles/MyLibSub.dir/ClassA.cpp.o: relocation
> >>>> R_X86_64_32 against `.rodata' can not be used when making a shared
> >>>> object; recompile with -fPIC
> >>>> CMakeFiles/MyLibSub.dir/ClassA.cpp.o: could not read symbols: Bad
> >>>> value collect2: error: ld returned 1 exit status
> >>>> make[2]: *** [libMyLib.so] Error 1
> >>>> make[1]: *** [CMakeFiles/MyLib.dir/all] Error 2
> >>>> make: *** [all] Error 2
> >>>> 
> >>>> When I add the line
> >>>> set_target_properties(MyLibSub PROPERTIES COMPILE_FLAGS "-fPIC")
> >>>> to the CMakeLists.txt, everything works fine. Am I doing something
> >>>> wrong? Should CMake add "-fPIC" automatically in this case? Your
> >>>> feedback is greatly appreciated.
> >>>> 
> >>>> Kind regards
> >>>> Benjamin
> >>>> 
> >>>> 
> >>>> 
> >>>> // --------------- ClassA.cpp ---------------
> >>>> #include "ClassA.h"
> >>>> #include<iostream>
> >>>> 
> >>>> void ClassA::printName() {
> >>>> 
> >>>>          std::cout<<   "ClassA"<<   std::endl;
> >>>> 
> >>>> }
> >>>> // --------------- ClassA.h ---------------
> >>>> #ifndef CLASSA_H
> >>>> #define CLASSA_H
> >>>> 
> >>>> struct ClassA {
> >>>> 
> >>>>          void printName();
> >>>> 
> >>>> };
> >>>> 
> >>>> #endif /* CLASSA_H */
> >>>> // --------------- ClassB.cpp ---------------
> >>>> #include "ClassB.h"
> >>>> #include<iostream>
> >>>> 
> >>>> void ClassB::printName() {
> >>>> 
> >>>>          std::cout<<   "ClassB"<<   std::endl;
> >>>>          a.printName();
> >>>> 
> >>>> }
> >>>> // --------------- ClassB.h ---------------
> >>>> #ifndef CLASSB_H
> >>>> #define CLASSB_H
> >>>> 
> >>>> #include "ClassA.h"
> >>>> 
> >>>> struct ClassB {
> >>>> 
> >>>>          void printName();
> >>>>          ClassA a;
> >>>> 
> >>>> };
> >>>> 
> >>>> #endif /* CLASSB_H */
> >>>> 
> >>>> --
> >>>> 
> >>>> Powered by www.kitware.com
> >>>> 
> >>>> Visit other Kitware open-source projects at
> >>>> http://www.kitware.com/opensource/opensource.html
> >>>> 
> >>>> Please keep messages on-topic and check the CMake FAQ at:
> >>>> http://www.cmake.org/Wiki/CMake_FAQ
> >>>> 
> >>>> Follow this link to subscribe/unsubscribe:
> >>>> http://www.cmake.org/mailman/listinfo/cmake
> >>> 
> >>> --
> >>> 
> >>> Powered by www.kitware.com
> >>> 
> >>> Visit other Kitware open-source projects at
> >>> http://www.kitware.com/opensource/opensource.html
> >>> 
> >>> Please keep messages on-topic and check the CMake FAQ at:
> >>> http://www.cmake.org/Wiki/CMake_FAQ
> >>> 
> >>> Follow this link to subscribe/unsubscribe:
> >>> http://www.cmake.org/mailman/listinfo/cmake
> >> 
> >> --
> >> 
> >> Powered by www.kitware.com
> >> 
> >> Visit other Kitware open-source projects at
> >> http://www.kitware.com/opensource/opensource.html
> >> 
> >> Please keep messages on-topic and check the CMake FAQ at:
> >> http://www.cmake.org/Wiki/CMake_FAQ
> >> 
> >> Follow this link to subscribe/unsubscribe:
> >> http://www.cmake.org/mailman/listinfo/cmake
> > 
> > --
> > 
> > Powered by www.kitware.com
> > 
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> > 
> > Please keep messages on-topic and check the CMake FAQ at:
> > http://www.cmake.org/Wiki/CMake_FAQ
> > 
> > Follow this link to subscribe/unsubscribe:
> > http://www.cmake.org/mailman/listinfo/cmake
> 
> --
> 
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> 
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
> 
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake


More information about the CMake mailing list