2013-11-22 2 views
2

Пытается скомпилировать этот код на C++ с помощью gcc в Linux. Он использует внешнюю библиотеку/приложение SCIP./usr/bin/ld: Не удается найти -l Ошибка (с использованием GCC в Linux GCC Linker Error)

Я компиляции, используя этот код:

gcc TestC.cpp -I./scipF/scip/src -L./scipF/scip/lib -l./scipF/scip/lib/libscip.a

, но я получаю эту ошибку:

/usr/bin/ld: cannot find -l./scipF/scip/lib/libscip.a

Файл находится в папке. Не знаю, почему он не выбирает его, чтобы связать

#include <iostream> 

#include "objscip/objscip.h" 
#include "objscip/objscipdefplugins.h" 


/** reads parameters */ 
static 
SCIP_RETCODE readParams(
    SCIP*      scip,    /**< SCIP data structure */ 
    const char*    filename   /**< parameter file name, or NULL */ 
    ) 
{ 
    if(filename != NULL) 
    { 
     if(SCIPfileExists(filename)) 
     { 
     std::cout << "reading parameter file <" << filename << ">" << std::endl; 
     SCIP_CALL(SCIPreadParams(scip, filename)); 
     } 
     else 
     std::cout << "parameter file <" << filename << "> not found - using default parameters" << std::endl; 
    } 
    else if(SCIPfileExists("scipmip.set")) 
    { 
     std::cout << "reading parameter file <scipmip.set>" << std::endl; 
     SCIP_CALL(SCIPreadParams(scip, "scipmip.set")); 
    } 

    return SCIP_OKAY; 
} 

/** starts SCIP */ 
static 
SCIP_RETCODE fromCommandLine(
    SCIP*      scip,    /**< SCIP data structure */ 
    const char*    filename   /**< input file name */ 
    ) 
{ 
    /******************** 
    * Problem Creation * 
    ********************/ 

    std::cout << std::endl << "read problem <" << filename << ">" << std::endl; 
    std::cout << "============" << std::endl << std::endl; 
    SCIP_CALL(SCIPreadProb(scip, filename, NULL)); 


    /******************* 
    * Problem Solving * 
    *******************/ 

    /* solve problem */ 
    std::cout << "solve problem" << std::endl; 
    std::cout << "=============" << std::endl; 
    SCIP_CALL(SCIPsolve(scip)); 

    std::cout << std::endl << "primal solution:" << std::endl; 
    std::cout << "================" << std::endl << std::endl; 
    SCIP_CALL(SCIPprintBestSol(scip, NULL, FALSE)); 


    /************** 
    * Statistics * 
    **************/ 

    std::cout << std::endl << "Statistics" << std::endl; 
    std::cout << "==========" << std::endl << std::endl; 

    SCIP_CALL(SCIPprintStatistics(scip, NULL)); 

    return SCIP_OKAY; 
} 

/** starts user interactive mode */ 
static 
SCIP_RETCODE interactive(
    SCIP*      scip    /**< SCIP data structure */ 
    ) 
{ 
    SCIP_CALL(SCIPstartInteraction(scip)); 

    return SCIP_OKAY; 
} 

/** creates a SCIP instance with default plugins, evaluates command line parameters, runs SCIP appropriately, 
* and frees the SCIP instance 
*/ 
static 
SCIP_RETCODE runSCIP(
    int      argc,    /**< number of shell parameters */ 
    char**     argv    /**< array with shell parameters */ 
    ) 
{ 
    SCIP* scip = NULL; 

    /********* 
    * Setup * 
    *********/ 

    /* initialize SCIP */ 
    SCIP_CALL(SCIPcreate(&scip)); 

    /*********************** 
    * Version information * 
    ***********************/ 

    SCIPprintVersion(scip, NULL); 
    std::cout << std::endl; 


    /* include default SCIP plugins */ 
    SCIP_CALL(SCIPincludeDefaultPlugins(scip)); 


    /************** 
    * Parameters * 
    **************/ 

    if(argc >= 3) 
    { 
     SCIP_CALL(readParams(scip, argv[2])); 
    } 
    else 
    { 
     SCIP_CALL(readParams(scip, NULL)); 
    } 
    /*CHECK_OKAY(SCIPwriteParams(scip, "scipmip.set", TRUE));*/ 


    /************** 
    * Start SCIP * 
    **************/ 

    if(argc >= 2) 
    { 
     SCIP_CALL(fromCommandLine(scip, argv[1])); 
    } 
    else 
    { 
     printf("\n"); 

     SCIP_CALL(interactive(scip)); 
    } 


    /******************** 
    * Deinitialization * 
    ********************/ 

    SCIP_CALL(SCIPfree(&scip)); 

    BMScheckEmptyMemory(); 

    return SCIP_OKAY; 
} 

/** main method starting SCIP */ 
int main(
    int argc,   /**< number of arguments from the shell */ 
    char** argv      /**< array of shell arguments */ 
    ) 
{ 
    SCIP_RETCODE retcode; 
     argc = 3; 
     argv [2]= "InputFile"; 
    retcode = runSCIP(argc, argv); 
    if(retcode != SCIP_OKAY) 
    { 
     SCIPprintError(retcode); 
     return -1; 
    } 

    return 0; 
} 

ответ

1

изменить -l./scipF/scip/lib/libscip.a к -lscip.

От documentation:

-llibrary

-llibrary

Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.)

...

The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a . The linker then uses this file as if it had been specified precisely by name.

The directories searched include several standard system directories plus any that you specify with -L .

0

Изменение -l./scipF/scip/lib/libscip.a к -l:./scipF/scip/lib/libscip.a.

Из документации:

LD(1)      GNU Development Tools      LD(1) 



NAME 
     ld - The GNU linker 

SYNOPSIS 
     ld [options] objfile ... 
... 

     -l namespec 
     --library=namespec 
      Add the archive or object file specified by namespec to the list of 
      files to link. This option may be used any number of times. If 
      namespec is of the form :filename, ld will search the library path 
      for a file called filename, otherwise it will search the library 
      path for a file called libnamespec.a. 

      On systems which support shared libraries, ld may also search for 
      files other than libnamespec.a. Specifically, on ELF and SunOS 
      systems, ld will search a directory for a library called 
      libnamespec.so before searching for one called libnamespec.a. (By 
      convention, a ".so" extension indicates a shared library.) Note 
      that this behavior does not apply to :filename, which always 
      specifies a file called filename. 

      The linker will search an archive only once, at the location where 
      it is specified on the command line. If the archive defines a 
      symbol which was undefined in some object which appeared before the 
      archive on the command line, the linker will include the 
      appropriate file(s) from the archive. However, an undefined symbol 
      in an object appearing later on the command line will not cause the 
      linker to search the archive again. 

      See the -(option for a way to force the linker to search archives 
      multiple times. 

      You may list the same archive multiple times on the command line. 

      This type of archive searching is standard for Unix linkers. 
      However, if you are using ld on AIX, note that it is different from 
      the behaviour of the AIX linker. 

Предупреждение: есть possible caveat в отношении динамических библиотек.

1

Вы хотите связать предварительно скомпилированную статическую библиотеку libscip.a, которая представляет собой набор файлов .o, упакованных в удобный архив. Самый простой способ связать такую ​​библиотеку - просто передать ее GCC в качестве входного файла. GCC распознает его и передает его компоновщику.

gcc TestC.cpp -I./scipF/scip/src ./scipF/scip/lib/libscip.a 
Смежные вопросы