今だけ人気マンガ100円レンタル特集♪

gccでコンパイルしたソフトをフリーではなく商用で販売しようとしています。(開発ソフト自身はLinux上で動作するもの)この場合、gcc自体はフリーソフトとしてGPLで適応されていますが、gccでコンパイルされた実行ソフトには著作権を持たせたり、ソースの公開をせずに商用目的で販売することは可能でしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>コンパイルされた実行ソフトには著作権を持たせたり、


>ソースの公開をせずに商用目的で販売することは可能でしょうか?

可能だと思います。
コンパイラーの著作権は相当の対価の要求と、複製、頒布、改変を禁止しているのが主な項目です。

コンパイラーの著作権は、コンパイラーを使って作った新ソフトには及びません。
新ソフトの著作権は新ソフトのソースコードを書いた人に帰属します。
    • good
    • 0

GCCのようなGPLで保護されたツールを使ってフリーではないプログラムをコンパイルすることはできますか?


http://www.gnu.org/licenses/gpl-faq.ja.html#CanI …

基本的にはGPLライセンスのソフトを使用して作成したものはGPLには縛られない。
あとは使用しているライブラリのライセンス次第。

人から聞いたのを鵜呑みにせずにgccのライセンスを読むべき。
読まないで自分のソフトのライセンスをでっちあげるのはナンセンスだ。

参考URL:http://www.gnu.org/licenses/gpl-faq.ja.html#CanI …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QGPLライセンスのライブラリを利用=ソース公開しなきゃだめ?

GPLライセンスについて調べています。
考え方がまちがっていたらご指摘いただきたいです。

1.GPLライセンスのライブラリを用いたシステム開発を行った場合
  ソースの開示を求められたら、開示しなければいけない?

たとえば、Javaで開発したシステムの場合、ここでいうソースコードとはjavaファイル郡になるのでしょうか?
jarファイルとかwarファイルだけでは駄目 ということですよね?

2.GPLライセンスのライブラリを用いたソフトを作って売る場合も
  同様で、ソースの開示を求められたら、開示しなければいけない?

つまりは、Javaで開発したソフトをパッケージ販売したいなら、
ソースコードをお客に開示するつもりでいなければならない ということでいいですか?

また、ソースコードを開示する先 は、お客だけでいいのでしょうか?
まったく関係のない人から開示を求められた場合も、ソースコードを渡さなきゃいけないのでしょうか?

以上です。
よろしくおねがいします。

Aベストアンサー

僕もあまり詳しくはないですが、
GPLで配布について求められていることは、
バイナリを直接配布する場合、そのバイナリを入手するのと
同じ手順でソースコードも入手できるようにすることだったと思います。

つまり、サイト経由でバイナリを配布するならば同じページでソースコードを配布しないとだめだし、CDで配るのなら、同じCDの同じディレクトリに同梱しないといけません。

ちなみに、GPLには、LGPLというライブラリ用の劣化したGPLがあります。
この場合、動的リンクをする場合にはGPL汚染はしなかったと思います。
利用しようとしているライブラリのライセンスを確認して、実際に利用している人に聞いてみるのがよいかと。。

参考URL:http://www.opensource.jp/lesser/lgpl.ja.html

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qcc と gcc の違い

CCとGCCの違いについて教えてください。
どちらも、コンパイラという点では同じだと思うのですが、なぜ2つの方式ができたのでしょうか??

少し話がずれますが、プログラムを汎用性も持たせるなら、どのようなオプションをつけるべきでしょうか?
-ansi とか -Wall あたりをつける癖をつけておけば十分なのでしょうか??

G++とGCCの違いについても知っていれば教えて下さい
初歩的な質問ですがお願いします

Aベストアンサー

GCCはそのコンパイラの固有名詞です。
http://gcc.gnu.org/ このサイトに解説があります。
ccは多くの場合そのシステムに標準で突いているコンパイラです。
そのOSのベンダが提供しているばあいもあれば、FreeBSDのように
中身はgccというものもあります。

g++とgccの違いはデフォルトでC++のファイルとして扱うか
というところが違うだけだったはずです。(多分)

Qprintfなど、標準関数のソースコードが知りたい

C言語、Linux初心者です。
タイトルの通り、printf, scanfなどの関数のソースコードや、main関数の呼出し部分のソースコードを見てみたいのですが、どこにあるのでしょうか。類似質問で
http://www.gnu.org/home.ja.html
から探せるとの回答がありましたが、出来ればもう少し具体的にお願いします。
RedHat Linux 7.3、gcc version 2.96を使っています。

Aベストアンサー

Linuxで用いられる「GNU Cライブラリ」(libc、glibc)はこちらです。http://www.gnu.org/software/libc/libc.html
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/?cvsroot=glibc
例えばprintfは、この中の「stdio」という部分に含まれます。
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdio/Attic/?cvsroot=glibc
リストの中の改訂番号(Rev.)をクリックすればソースが見られます。

mainの呼び出し部分については残念ながら詳しくありません。

参考URL:http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdio/Attic/?cvsroot=glibc

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

QC++とVC++の違いについて

この質問をご覧頂きありがとうございます。

みなさんに2つ、お聞きしたいことがあり、質問させていただきます。
1.C++とVC++とでは、どのくらいの違い(どういう違い、特徴)があるのでしょうか?

2.また、これからC++/VC++でプログラミングを始めようとした場合、
C++からVC++へと段階を踏んで勉強した方がよいのでしょうか?

一応、私のプログラミングの履歴としては、
言語としてVisual Basicは多少勉強はしておりました。
また、オブジェクト指向の基礎程度(多相、継承、カプセル化)は理解しています。

抽象的な質問で大変恐縮なのですが、
みなさんの経験論や、ご参考にした本、HP等がありましたら、
ご教授いただければと思います。

Aベストアンサー

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いですが、VC++とMFCを使用してウインドウアプリケーションを作りたいという事であれば、死に物狂いな勉強が必要が必要かもしれません。Windowアプリケーションの処理プロセスを理解していないと、とっても難解に感じると思います。
 VC++でなければいや!という理由がなく、Visual Basicからスムーズに移行でき、かつVisual Basicより奥の深い事をしたい、というならば C++ Builder をお勧めします。 こちらで腕を慣らし、徐々にWindowアプリケーションの処理プロセス(WinMainから始まるプログラムの組み方の事です)を学ぶと良いかな、と思います。 その上で VC++&MFCな環境に移行すると、敷居はぐっと低くなります。
 私は一度VC++&MFCに挫折しましたが、こちらの方法で何とか理解する事が出来ました(^^;

 参考になれば幸いです(..
 

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いで...続きを読む

QC言語で、メモリを解放しないで終わるプログラム

C言語の話です。

mallocなどで領域を確保したら、解放しなければいけないんですよね。
しかし、解放しないで終了すると具体的にどうなるのか、私は理解していません。

次のような、freeしないプログラムを作って何回か実行してみました。しかし、別におかしくならないですね。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *cp;

int main(void)
{
unsigned int n;

printf("サイズ(2以上)を入力してください:");
scanf("%d",&n);

cp=malloc(n);
if(!cp)
{
printf("%s\n","mallocできませんでした。");
return(1);
}

strcpy(cp,"A");
printf("cpは%sです。\n", cp);

printf("それでは終わりにします\n");

return(0);
}


グローバルでcharの固定長の配列を宣言したとすれば、プログラムの終了時にその領域は解放されると思います。

このような固定長の配列の場合とmallocの場合との違いが問題なんです。

 実験的に、解放しないがために何かおかしくなってしまったり、悪影響を及ぼしたりするようなプログラムを作りたいんですが、どのようにすればよいでしょうか。

もしも私の環境ではそのようなプログラムが作れないなら、別の環境の話でもよいので具体的にこんなふうになってしまうという話をお聞きしたいんです。


過去の質問を検索してみました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=160037
ここのNo.9では、「freeしないアプリケーションの起動・終了を繰り返すと、リソースが不足する」旨が書かれていて、質問者の方もそれで納得されているようです。
しかし、私は、リソースが不足するとはどういうことで、何が起こるのか、知りません。

私のマシン
OS:Windows98SE
VC++6.0

C言語の話です。

mallocなどで領域を確保したら、解放しなければいけないんですよね。
しかし、解放しないで終了すると具体的にどうなるのか、私は理解していません。

次のような、freeしないプログラムを作って何回か実行してみました。しかし、別におかしくならないですね。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *cp;

int main(void)
{
unsigned int n;

printf("サイズ(2以上)を入力してください:");
scanf("%d",&n);

cp=malloc(n);
if(!cp)
{...続きを読む

Aベストアンサー

書き忘れましたのでもう一度。

malloc/freeを1セットで考えている人がいるようですが、「プログラム終了時にすべてをfreeする」なんていう処理は愚の骨頂です。

malloc/freeはマンションの内装工事のようなものです。
mallocは次の入居者のために内装工事を行います。
freeは次の入居者のための回復工事です。
マンション自体の取り壊し(=プログラムの終了)が行われる寸前に回復工事の必要はありません。

動的メモリ領域を10000個くらい確保して、freeして終了する場合とfreeせずに終了する場合を比べてみてください。
プログラム終了寸前にfreeするのは無駄以外の何者でもありません。

Q構造体の初期化のmemsetの第三引数

memset(&lvitem, 0, sizeof(LVITEM));
memset(&lvitem, 0, sizeof(lvitem));
LVITEMに特化した質問ではなく構造体の初期化について、この2つの書き方によるソース管理やコンパイルでのメリットとデメリットを教えてください。

Aベストアンサー

(1)memset(&lvitem, 0, sizeof(LVITEM));
この書き方は、構造体LVITEMを初期化しているんだな、と分かりやすい。
(2)memset(&lvitem, 0, sizeof(lvitem));
この書き方はとにかく変数lvitemを初期化するんだな、という感じだが、型が分からないので宣言しているところを参照しなければならない。
それともう一つ、ただ単に何回も初期化するんでなければ、こういう書き方もできる。
(3)LVITEM lvitem = {0};

結局どれがいいのかといえば、個人的にはケースバイケースですねえ。初期化を1回すればいいような感じなら(3)、構造体名を明示した方が調べる手間がなくなるようなら(1)、そうでなければ(2)を使います。
コンパイルでのメリット、デメリットは特にないんじゃないかなあ。アセンブラがまだ全盛だった頃ならともかく、いまじゃどのコンパイラだって最適化オプションで同じようなコードはくでしょう。
気にするほどでもないと思うけど…

Q~以外を削除する場合(rmコマンド)

linuxのコマンドで
~以外のファイル、ディレクトリを全て削除したい時は
どのような記述をすれば良いのでしょうか?
シェルスクリプトではなくrmコマンド1つで削除したのいですが…

例: tar以外のファイル・ディレクトリを
   すべて削除したい場合など

どなたかご存知の方がいらっしゃったら
教えてください。よろしくお願い致します。

Aベストアンサー

rm コマンドのみという訳にはいきませんが基本的なコマンドを組み合わせると実現可能と思います。

「名前が tar で終わるもの以外のファイル・ディレクトリを削除する」場合だと

ls | grep -v -E 'tar$' | xargs rm -r

となります。

ファイルの一覧を取得し ( ls )
'tar'で終わるもの以外を抽出し ( grep )
その結果を rm -r の引数に指定して実行 ( xargs )

という流れです。

ファイルを削除するような操作については失敗するとダメージが大きいので、事前にテストして動作を確認すると良いとおもいます。また rm -r -i としてそれぞれのファイルについて、削除の問い合わせをするのも有効です。

Qファイル読み込み/書き込み速度を上げるには

下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか?

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data"));
BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data"));
int c ;
while((c = in.read()) != -1)
{
out.write(c);
}
in.close();
out.flush();
out.close();

Aベストアンサー

速くなるかどうかは環境によって微妙に違うと思いますが、効率よくやる方法が2つあります。

1. 1バイトづつ読み書きするのではなくて byte[] で1000バイトとかの塊を読んでそのまま塊を書くようにする。(こうすると read, write をする回数が減るので少し速いと思います)。

2. FileInputStream と FileOutputStream のインスタンス双方から getChannel() で java.nio.channels.FileChannel のインスタンスを取り出し、FileOutputStream 側から取り出した FileChannel のインスタンスに対して transferFrom() で FileInputStream 側から取り出した FileChannel のインスタンスを指定する。

例) in は FileInputStream のインスタンス, out が FileOutputStream のインスタンスの場合。

FileChannel fcin = in.getChannel(), fcout = out.getChannel();
fcout.transferFrom(fcin, 0, fcin.size());

速くなるかどうかは環境によって微妙に違うと思いますが、効率よくやる方法が2つあります。

1. 1バイトづつ読み書きするのではなくて byte[] で1000バイトとかの塊を読んでそのまま塊を書くようにする。(こうすると read, write をする回数が減るので少し速いと思います)。

2. FileInputStream と FileOutputStream のインスタンス双方から getChannel() で java.nio.channels.FileChannel のインスタンスを取り出し、FileOutputStream 側から取り出した FileChannel のインスタンスに対して transferFrom()...続きを読む


人気Q&Aランキング