2016-08-27 19 views
0

Linux C++ .so共有オブジェクトライブラリからグローバルC++関数をエクスポートし、それらの関数をLinux C++ .outアプリケーションで使用したいと考えています。LinuxからのC++関数のエクスポート/インポートダイナミックライブラリ/ Linuxコンソールアプリケーション| Visual Studio Linux Project

これは、Linux開発環境でこれが通常どのように行われるかの例を見てきました。しかし、私はVisual Studio Linuxプロジェクトと新しいVisual C++ for Linux Development拡張機能を使用しています。私が見た例の多くのステップは、Visual Studioビルドシステムによって処理されるので、状況はこの状況では少し異なるように見えます。

Visual Studioで2つのLinux C++プロジェクトを作成しました。これは空のプロジェクトの1つで、プロパティとコンソールアプリケーションでは.soに変更されています。私はコンソールアプリケーションで共有オブジェクトライブラリを参照しました。

共有オブジェクトライブラリプロジェクトには、functions.hfunctions.cppという2つのファイルがあります。私は消費するコンソールアプリケーションへfunctions.hファイルを追加した

#include functions.h 
extern "C" void Function_01() { 
    return 0; 
} 

functions.h

#pragma once 
void Function_01(); 

functions.cpp ...

#include <cstdio> 
#include "functions.h" 

int main() 
{ 
    Function_01(); 
    return 0; 
} 

おそらく、エクスポートするグローバル関数は思わ奇妙ですが、私の問題では、これは最も自然なアプローチのようですが、私はfライブラリが構築されリンクされると、ネームスペース内のunctions

私は間違っていますか?これらのVisual C++ for Linux開発プロジェクトをリンクし、共有オブジェクトライブラリからエクスポートされた関数を消費するにはどうすればよいですか?

+0

これは*関連するかもしれません:https://gcc.gnu.org/wiki/Visibility –

答えて

0

ライブラリ関数はデフォルトでエクスポートされるので、gccを使用してアプリケーションをビルドするときにコード内で呼び出し、ライブラリとリンクするだけです。

  • MYPROGはあなたが./myprog
  • functionsでコマンドラインから実行することができ、あなたのコンソールアプリケーションの実行可能です:

    g++ -o myprog myprog.cpp -lfunctions -L/home/test/projects/mylibs 
    

    :あなたはのようになりますコマンドラインを目指していますlibfunctions.soという名前の共有オブジェクトライブラリを指します( 'lib'と '.so'は自動的にあらかじめ追加されています)

  • libfunctions.soは/ home/test/projects/mylibsにあります

Visual C++ for Linux開発(VCLinux)では、プロジェクト設定のリンカ/入力/ライブラリ依存関係の下で、ライブラリの名前をfunctionsに指定し、ライブラリが見つかるフォルダのパスを指定しますリンカ/一般/追加ライブラリディレクトリの下にあります。私。 WindowsアプリケーションとDLLをリンクするときと同じように。

VCLinuxは、Visual Studioユーザーにとって使い慣れた開発環境を提供します。しかし、VCLinuxはアプリケーションをコンパイルしてリンクするためのg ++​​コマンドを生成しますが、Linux上でgccを使ってアプリケーションを構築することについて学んだことは何でも適用されます。あなたはmakefileの章を今はスキップすることができますが。

また、VCLinuxは非常に多くの作業が進行中であることに注意してください。特にテストコンソールアプリケーションを使用した共有ライブラリのデバッグに関するいくつかの問題があります。詳細はVCLinux GitHub project pageにあります。あなたは積極的で建設的なフィードバックに貢献することが奨励されています。

+0

ありがとうございました。私はリンクしている共有ライブラリで、 '-lfunctions'オプションは静的な' .a'ライブラリのようですので、私はあなたの事例を得ることができませんでした。コマンドラインで 'libFuntions.so.1.0'ライブラリのフルパスを指定すると効果が見られました。 Visual Studioでは、これはリンカー>入力>追加の依存関係に完全パスを入力することに相当します。しかし、私はリンクされた共有オブジェクトライブラリにデバッグする必要があります。ライブラリへのデバッグは現在の設定では有効になっていません...共有オブジェクトライブラリへのデバッグを有効にする方法に関するアイデアはありますか? –

+0

共有ライブラリへのリンクは静的ライブラリと同じです。これはパスのために '-L'とライブラリ名のために' -l'を組み合わせたものです。出力の冗長性を高め、コンパイラとリンカのコマンドラインを調べることをお勧めします。あなたはそれをやり遂げた方法と私の提案は実際に同じであることが分かるはずです。 [詳細はこちら](https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/#verbose) – stanthomas

+0

VCLinuxでデバッガと共有ライブラリに入るには、gdbモードでデバッグする必要があります(gdbはリモートシステム上で完全に実行されます)。プロジェクト設定のデバッグ/デバッグモードを参照してください。これには、[VCLinux GitHubプロジェクトサイト](https://github.com/Microsoft/VSLinux)で提起された独自の問題があります。 – stanthomas

関連する問題