1

2 つの異なるディレクトリに 2つの独立した.cppコードがあるとします (これは私の質問の単なる概略図であることに注意してください)。

これが最初のものです...独自のMakefileを持つ独自のディレクトリで正常にコンパイルできます

// special libraries to include
#include "acado.h"  
#include "auxiliary_functions.c" 
/* -------------------------- */
// Create objects for special classes 
   ACADOvariables acadoVariables; 
   ACADOworkspace acadoWorkspace;

int main(){
    // perform task A_1
    // perform task A_2 
    // Tasks A_1 and A_2 depend on the specially included headers
    return 0;
}

そして、ここに 2 番目のものがあります... 繰り返しますが、このコードは、独自の Makefile を持つ独自のディレクトリで正常にコンパイルできます。

#include <stdio.h>
#include <stdlib.h>
#include "Aria.h"
/* -------------------------- */
// Create objects for special classes 
  ArPose pose;
  ArRobot robot;

int main(){
    // perform task B_1
    // perform task B_2 
    // Tasks B_1 and B_2 depend on the specially included headers
    return 0;
}

さて、私の目的のために、次のようなソースコードが必要です...

// special libraries to include from both packages
#include <stdio.h>
#include <stdlib.h>
#include "Aria.h"
#include "acado.h"  
#include "auxiliary_functions.c" 
/* -------------------------- */
// Create objects for special classes from Part1
   ACADOvariables acadoVariables; 
   ACADOworkspace acadoWorkspace;
/* -------------------------- */
// Create objects for special classes from part2
  ArPose pose;
  ArRobot robot;
int main(){
    // perform task B_1
    // perform task A_1 (this task depends on values returned by B_1)
    // perform task B_2 (this task depends on values returned by A_1)
    // perform task A_2 (this task depends on values returned by B_1)
    return 0;
}

では、2 つのパッケージと、この最後のコードをコンパイルするために既に必要な 2 つの makefile をどのように使用すればよいでしょうか? ... 両方のパッケージ コンテンツ (ファイルとフォルダー) を 1 つのディレクトリに配置しようとしましたが、1 つのメイクファイルには個々のメイクファイルの両方のコンテンツが含まれていましたが、これは 3 番目のスクリプトのコンパイルに成功しませんでした...

あなたの助けは本当に感謝しています...

4

2 に答える 2

0

各パッケージをライブラリにコンパイルします。それはおそらくメイクファイルがすでに行っていることです。

編集:これらの両方のファイルに関数が含まれていることをどういうわけか見逃しており、main()それぞれが個別の実行可能ファイルにコンパイルされていることを明確に示しています。再利用したいコードをそれらから切り出し、それをプロジェクトに含めるか、そこからライブラリを作成してリンクする必要があります。


ライブラリのリンク方法に関する古い回答。ここではさらに多くのことが必要になります:

独自のパッケージよりも、コンパイラ フラグを渡します。

  • -Iコンパイル段階のpath_to_the_headersであるため、 #include ディレクティブはヘッダーを見つけます。
  • -Lリンク段階のpath_to_the_ .a_filesは、ライブラリーを探す場所をコンパイラーに指示します
  • -l使用するライブラリーをコンパイラーに伝えるためのリンク・ステージのlibname

lib最後のオプションは、ライブラリが何かと呼ばれている場合、何か.aを書くだけ-lという点で少し奇妙です。gcc ではなくほとんどのコンパイラを使用する Windows では、ライブラリは代わりに何かと呼ばれます。.lib

于 2013-02-11T15:18:00.427 に答える
0

現在のシナリオで最初に確認することは、メイクファイルが単なるオブジェクト ファイルではなく実行可能ファイルを作成しているかどうかです。各メイクファイルからの出力を単独で実行できると言っているのであれば、後者のように思えます。出力が実際にオブジェクト ファイルではなく実行可能ファイルである場合、これらの実行可能ファイルを一緒に新しい実行可能ファイルに "リンク" することはできません。したがって、各.cppファイルのコンパイル プロセスの出力が拡張子付きのオブジェクト ファイルであり、 1 つのファイル.oだけが関数を持っていることを確認する必要があります。実行可能ファイルではなくオブジェクト ファイルを作成するプロセスは、オプション withを使用して実行できます。 .cppmain()-cg++

各ファイルからオブジェクトおよび/またはライブラリ ファイルを作成し、エントリポイント関数を.cpp含む単一の.cppファイルをmain()作成したら、オブジェクト/ライブラリ ファイルをリンクして、g++説明した機能を含む最終的な実行可能ファイルを作成できます。個々の.cppファイルのそれぞれにあります。

于 2013-02-11T15:16:49.433 に答える