Linking Problem With Autoconf / Automake - Unix

This is a discussion on Linking Problem With Autoconf / Automake - Unix ; I have recently converted my C++ project to use Autoconf / Automake and have hit a strange problem. The program will only link if I include one particular library four times in the myprog_LDADD statement in the Makefile.am in my ...

+ Reply to Thread
Results 1 to 4 of 4

Thread: Linking Problem With Autoconf / Automake

  1. Linking Problem With Autoconf / Automake

    I have recently converted my C++ project to use Autoconf / Automake and have
    hit a strange problem.

    The program will only link if I include one particular library four times in
    the myprog_LDADD statement in the Makefile.am in my top level directory. If
    I remove the last occurrence, I get undefined symbols.

    I was aware that it is sometimes necessary to repeat libraries in the list
    of libraries, but I thought it would be sufficient for each library to
    occur twice.

    Can anyone help? What is happenong?

    I have included my Makefile.am below. I have highlighted the offending
    library with ****

    I'm fairly new to Autoconf / Automake, so I may well be doing something
    completely wrong!

    Chris Gordon-Smith
    www.simsoup.info


    =======================================
    SUBDIRS = Utilities Kernel User_Interface_Presentation
    User_Interface_Manager \
    Statistics Persistent_Data_Manager Global_Include

    METASOURCES = AUTO
    bin_PROGRAMS = simsoup
    simsoup_SOURCES = main.cpp
    noinst_HEADERS =

    AM_CPPFLAGS = -I./Global_Include \
    -I./Utilities \
    -I./Utilities/Logger \
    -I./User_Interface_Presentation/SimSoup_GUI/API \
    -I./User_Interface_Manager/Form_Manager \
    -I./User_Interface_Manager/Form_Manager/User_Actions_API \
    -I./Kernel/Kernel_Manager \
    -I./Statistics \
    -I./Persistent_Data_Manager

    simsoup_LDADD = ./Kernel/Kernel_Manager/libKernel_Manager.a
    \
    ./Kernel/Kernel_API/libKernel_API.a
    \
    ./Kernel/Reactor/libReactor.a
    \
    ./Kernel/Simulation/libSimulation.a
    \
    ./Kernel/Simulation/Action_Request/libAction_Request.a
    \
    ./Kernel/Simulation/ActReq_Rqstr/libActReq_Rqstr.a
    \
    ./Kernel/Simulation/Attribute/libAttribute.a
    \
    ./Kernel/Tracker/libTracker.a
    \
    ./User_Interface_Manager/Form_Manager/libForm_Manager.a
    \
    ./User_Interface_Manager/Network_Painter/libNetwork_Painter.a
    \
    ./User_Interface_Presentation/GUI_Tools/libGUI_Tools.a
    \
    ./User_Interface_Presentation/SimSoup_GUI/libSimSoup_GUI.a
    \
    ./Utilities/libUtilities.a
    \
    ./Utilities/List/libList.a
    \
    ./Utilities/Logger/libLogger.a
    \
    ./Statistics/libStatistics.a
    \
    ./Persistent_Data_Manager/libPersistent_Data_Manager.a
    \
    ./Kernel/Chemistry/libChemistry.a
    \

    \
    ./Kernel/Kernel_Manager/libKernel_Manager.a
    \
    ./Kernel/Kernel_API/libKernel_API.a
    \
    ./Kernel/Reactor/libReactor.a
    \
    ./Kernel/Simulation/libSimulation.a
    \
    ./Kernel/Simulation/Action_Request/libAction_Request.a
    \
    ./Kernel/Simulation/ActReq_Rqstr/libActReq_Rqstr.a
    \
    ./Kernel/Simulation/Attribute/libAttribute.a
    \
    ./Kernel/Tracker/libTracker.a
    \
    ./User_Interface_Manager/Form_Manager/libForm_Manager.a
    \
    ./User_Interface_Manager/Network_Painter/libNetwork_Painter.a
    \
    ./User_Interface_Presentation/GUI_Tools/libGUI_Tools.a
    \
    ./User_Interface_Presentation/SimSoup_GUI/libSimSoup_GUI.a
    \
    ./Utilities/libUtilities.a
    \
    ./Utilities/List/libList.a
    \
    ./Utilities/Logger/libLogger.a
    \
    ./Statistics/libStatistics.a
    \
    ./Persistent_Data_Manager/libPersistent_Data_Manager.a
    \
    ./Kernel/Chemistry/libChemistry.a
    \
    ./Kernel/Chemistry/libChemistry.a
    \
    ./Kernel/Chemistry/libChemistry.a // ****FAILS TO
    LINK IF THIS IS REMOVED

    simsoup_LDFLAGS = -L./Kernel/Chemistry \
    -L./Kernel/Kernel_Manager \
    -L./Kernel/Kernel_API \
    -L./Kernel/Reactor \
    -L./Kernel/Simulation \
    -L./Kernel/Simulation/Action_Request \
    -L./Kernel/Simulation/ActReq_Rqstr \
    -L./Kernel/Simulation/Attribute \
    -L./Kernel/Tracker \
    -L./User_Interface_Manager/Form_Manager \
    -L./User_Interface_Manager/Network_Painter \
    -L./User_Interface_Presentation/GUI_Tools \
    -L./User_Interface_Presentation/SimSoup_GUI \
    -L./Utilities \
    -L./Utilities/List \
    -L./Utilities/Logger \
    -L./Statistics \
    -L./Persistent_Data_Manager \
    -L/usr/lib \
    -L/lib \
    -L/usr/local/lib \
    \
    `pkg-config gtkmm-2.4 --libs` \
    `pkg-config gsl --libs`
    =====================



  2. Re: Linking Problem With Autoconf / Automake

    Chris Gordon-Smith wrote:

    > I have recently converted my C++ project to use Autoconf / Automake and
    > have hit a strange problem.
    >
    > The program will only link if I include one particular library four times
    > in the myprog_LDADD statement in the Makefile.am in my top level
    > directory. If I remove the last occurrence, I get undefined symbols.
    >
    > I was aware that it is sometimes necessary to repeat libraries in the list
    > of libraries, but I thought it would be sufficient for each library to
    > occur twice.
    >
    > Can anyone help? What is happenong?
    >
    > I have included my Makefile.am below. I have highlighted the offending
    > library with ****
    >
    > I'm fairly new to Autoconf / Automake, so I may well be doing something
    > completely wrong!
    >
    > Chris Gordon-Smith
    > www.simsoup.info
    >


    Problem now fixed. It seems to have been something my IDE was doing to the
    build files, rather than a 'real' problem. Invoking the build from the
    command line works fine.

    Apologies for any inconvenience.

    Chris Gordon-Smith
    www.simsoup.info

  3. Re: Linking Problem With Autoconf / Automake

    On 13 Sep, 17:58, Chris Gordon-Smith wrote:
    > Chris Gordon-Smith wrote:


    > > I have recently converted my C++ project to use Autoconf / Automake and
    > > have hit a strange problem.

    >
    > Problem now fixed. It seems to have been something my IDE was doing to the
    > build files, rather than a 'real' problem. Invoking the build from the
    > command line works fine.


    One more data point to convince me that most IDE's are
    more trouble than they are worth.

    One point: in your Makefile.am, you have:
    AM_CPPFLAGS = -I./Global_Include
    \
    -I./Utilities
    \


    It is probably better to use:
    -I$(srcdir)/Global_include

    since using '.' makes a VPATH build impossible.
    (ie, you must run configure from the top srcdir, and
    won't be able to do:
    mkdir build && cd build && ../srcdir/configure
    which is a really convenient feature that people
    expect to work.)

  4. Re: Linking Problem With Autoconf / Automake

    William Pursell wrote:

    > On 13 Sep, 17:58, Chris Gordon-Smith wrote:
    >> Chris Gordon-Smith wrote:

    >
    >> > I have recently converted my C++ project to use Autoconf / Automake and
    >> > have hit a strange problem.

    >>
    >> Problem now fixed. It seems to have been something my IDE was doing to
    >> the build files, rather than a 'real' problem. Invoking the build from
    >> the command line works fine.

    >
    > One more data point to convince me that most IDE's are
    > more trouble than they are worth.
    >
    > One point: in your Makefile.am, you have:
    > AM_CPPFLAGS = -I./Global_Include
    > \
    > -I./Utilities
    > \
    >
    >
    > It is probably better to use:
    > -I$(srcdir)/Global_include
    >
    > since using '.' makes a VPATH build impossible.
    > (ie, you must run configure from the top srcdir, and
    > won't be able to do:
    > mkdir build && cd build && ../srcdir/configure
    > which is a really convenient feature that people
    > expect to work.)


    Thanks. I'll adopt $(srcdir) as you suggest throughout.

    Regarding IDEs, my view is that a very good code explorer is essential,
    along with a facility that can navigate in one key press / button click to
    a line of code referenced in a complier / linker message.

    With a lot of tweaking, I managed to get a usable code explorer setup with
    Emacs, using Emacs Code Browser(ECB). Eventually however I concluded that
    it was not as effective as the KDevelop code browser, mainly because it
    presents a less integrated view and in some cases behaves unpredictably.

    Apart from this, I prefer to take control of what is going on in a number of
    aress. This applies particularly to the build. KDevelop does a good job of
    producing a set of Makefiles without the programmer needing to know
    anything about Make, Autoconf or Automake. However, I was only able to
    create a source distribution when I began to understand what was actually
    happening, and I don't let my IDE change the build files (except by mistake
    as above).

    Chris Gordon-Smith
    www.simsoup.info


+ Reply to Thread